MCP Support

Troubleshooting

Most MCP failures are one of three things: the client cannot reach the server, the OAuth grant is stale, or the document is not in the status the tool needs. This page covers all three, plus the error codes you will see.

Start here

Before digging into your client, confirm the server itself is reachable and advertising discovery correctly. An unauthenticated request should return 401 with a WWW-Authenticate header — that is success, not failure:

terminal
# Expect: 401 with a WWW-Authenticate header naming the metadata document
curl -i -X POST https://api.signvoy.com/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# Expect: 200 with the protected-resource metadata
curl -s https://api.signvoy.com/.well-known/oauth-protected-resource/mcp

# Expect: 200 with the authorization-server metadata
curl -s https://api.signvoy.com/.well-known/oauth-authorization-server
If all three behave as described, the server is healthy and the problem is in the client configuration or the grant — jump to Connection problems or Auth and consent below.

Connection problems

The server does not appear in my client at all

Almost always malformed JSON in the config file — a trailing comma after the last entry is the most common cause. Clients tend to fail silently rather than reporting a parse error. Validate the file:

terminal
# macOS / Linux — prints an error if the JSON is invalid
python3 -m json.tool ~/.cursor/mcp.json

python3 -m json.tool \
  ~/Library/Application\ Support/Claude/claude_desktop_config.json

Also confirm you restarted the client. Claude Desktop reads its config only at startup, so a reload is not enough — quit fully and reopen.

The server appears but lists no tools

Tool discovery happens after authentication. A connected server with zero tools means the OAuth flow has not completed — look for a login or authenticate control next to the server in your client's MCP settings and run it.

It lists fewer tools than documented

Discovery was interrupted partway through. Toggle the server off and on to force a fresh tools/list. Compare against the tool reference to see what is missing.

Auth and consent

It keeps asking me to authenticate

A consent loop means the token is not surviving between calls. Three things to check, in order:

  • Duplicate entries in your config pointing at the same URL under different names — each registers separately and they can fight over the grant.
  • The client cannot write to its credential store, so the token is discarded after each session.
  • The grant is being revoked externally. Confirm it still exists under Workspace Settings → AI Agents, or with GET /v1/mcp-grants.

“Ambiguous workspace” on a tool call

Your account belongs to more than one workspace and the call did not say which to use. This is deliberate: guessing would let an agent draft or send a contract from the wrong workspace, which is not something you can undo after the emails go out. The error lists the workspaces with their UUIDs, so tell your assistant which one you meant and it can retry straight away — pass workspace_id on every subsequent call in that conversation.

The agent is acting on the wrong workspace

A workspace is only ever chosen by the tool call itself, so this means the assistant passed a workspace_id you did not intend. Ask it to run signvoy_list_workspaces and confirm which UUID it is using. Drafts created in the wrong workspace cannot be moved; void them and recreate rather than trying to transfer.

The same grants are available over the API if you would rather script it:

terminal
# List your active grants
curl -s https://api.signvoy.com/v1/mcp-grants \
  -H "Authorization: Bearer sk_live_..."

# Revoke one — the client will re-run consent on its next call
curl -X DELETE https://api.signvoy.com/v1/mcp-grants/<grant-id> \
  -H "Authorization: Bearer sk_live_..."
Revoking keeps the row for audit purposes and simply marks it revoked, so the same client can be re-authorized later.

JSON-RPC error codes

These are transport-level errors — the request never reached a tool. Failures inside a tool are different: they come back as a normal result with isError: true and a prose message naming the constraint and the fix, which is what the model reads.

-32001

Unauthorized · HTTP 401

The bearer token is missing, expired, or not a Clerk OAuth token. The response carries a WWW-Authenticate header pointing at the resource metadata document; a compliant client re-runs the OAuth flow automatically.

-32002

Forbidden · HTTP 403

The OAuth client is not authorized for this account. Re-authorize it from your MCP client and reconnect. Permission failures on a specific workspace or document are not transport errors — they come back as tool results with isError set.

-32003

Rate limited · HTTP 429

You exceeded 120 requests per 60 seconds for this token. Wait for the window to roll over and retry.

-32600

Invalid request · HTTP 400

The JSON-RPC envelope or a tool argument failed validation. Check UUID formats and enum values against the tool reference.

-32601

Not found · HTTP 404

The tool name is unknown, or the referenced document or template does not exist. List resources first rather than guessing IDs.

-32603

Internal error · HTTP 500

An unexpected server-side failure. Retry once; if it persists, contact support with the timestamp.

Document status errors

Tools enforce the document state machine. These are the constraints people hit most:

Template has no published version

signvoy_create_document requires hasPublishedVersion: true. Publish the template in the dashboard — a draft-only template will always fail.

RECIPIENT_EMAIL_MISSING send blocker

A recipient was created without an email address, so the document cannot be sent. Call signvoy_update_document with the full recipient list — it replaces all recipients, so include the unchanged ones too.

Cannot update a sent document

signvoy_update_document is draft-only. After sending, the only way to change a document is to void it and create a new one.

Signing link requires status 'sent'

signvoy_create_signing_link rejects in_progress, which a document enters as soon as the first recipient signs — even while others are still pending. Create links before the first signature, or rely on the links already emailed to recipients.

Signed PDF not available

signvoy_get_signed_pdf_url only works on completed documents. Check per-recipient state with signvoy_get_document_status to see who is outstanding.

Forbidden on someone else's document

Workspace members can only act on their own documents. Admins and owners can act on any document in the workspace. Check your role with signvoy_list_workspaces.

Rate limits

120 requests per 60 seconds, bucketed per OAuth token — so each client has its own budget and one hitting the ceiling does not throttle the others. Exceeding it returns -32003.

The usual cause is a polling loop. An agent asked to “watch” or “monitor” a document will call signvoy_get_document_status repeatedly. Ask for status once instead, and use webhooks if you genuinely need to react the moment a document completes.

Local development

Pointing a client at a local API works, but two things trip people up. The API listens on the port set by PORT, which defaults to 3001 — check what your instance actually bound before assuming a port:

mcp.json
{
  "mcpServers": {
    "signvoy-local": {
      "url": "http://localhost:3001/mcp",
      "transport": "streamable-http"
    }
  }
}

Second, OAuth discovery points at the configured MCP_RESOURCE_URL and CLERK_OAUTH_ISSUER. If those still reference production while the server runs locally, your client will register against the wrong authorization server and consent will fail. Keep both consistent with the environment you are running.

FAQ

Why does my MCP client keep asking me to authenticate?

A repeating consent prompt usually means the client cannot persist the token, or the grant is being revoked between calls. Check that the client has write access to its own config or credential store, and confirm the grant still exists with GET /v1/mcp-grants. If you have multiple Signvoy entries in your config pointing at the same URL, remove the duplicates.

What does JSON-RPC error -32002 mean on the Signvoy MCP server?

It maps to HTTP 403 Forbidden and means the OAuth client is not authorized for your account. Re-authorize it from your MCP client and connect again. Permission problems with a particular workspace or document are not transport errors — they come back as a tool result with isError set.

Why does the agent say a template cannot be used?

Documents can only be created from a template with a published version. If signvoy_list_templates reports hasPublishedVersion: false, publish the template in the Signvoy dashboard first — a draft-only template will always fail at create time.

Why can't I create a signing link for a document that has been sent?

Signing-link creation requires the document status to be exactly sent. As soon as the first recipient signs, the document moves to in_progress and link creation fails even though other recipients are still pending. Generate links before the first signature, or use the emailed links.

What is the rate limit on the Signvoy MCP server?

120 requests per 60 seconds, bucketed per OAuth token. Exceeding it returns JSON-RPC -32003 and the agent is told to wait and retry. Agents that poll status in a loop are the usual cause — ask for status once rather than watching.

Why is the agent acting on the wrong workspace?

Because the tool call passed that workspace_id — nothing else selects a workspace. Ask the assistant to run signvoy_list_workspaces, confirm the UUID it should be using, and pass workspace_id on every call in the conversation.

Stop chasing signatures

Join thousands of teams using Signvoy to close deals, onboard clients, and sign contracts — faster.

No credit card · Free forever plan · Cancel anytime