The FullContact MCP Server is authenticated with the same API key you use for direct calls to the FullContact REST API. There is no separate MCP credential, no OAuth flow, and no need to provision new accounts. If your API key can call person.enrich today, it can drive the MCP Server tomorrow.
If you do not yet have a key, see Generate an API Key. The key must:
person.enrich included in its product entitlements.📘 Note
A single API key can be used across multiple AI clients simultaneously (e.g., Claude Desktop on a developer's laptop and a hosted Cursor workspace). All calls count against the same rate limit and quota.
The MCP Server expects the key in the standard Authorization HTTP header on every request from the client:
Authorization: Bearer <your-fullcontact-api-key>
Each client configures this differently. The patterns used in our Quickstarts are:
Client-specific configuration:
Authorization: Bearer ... string inside args in claude_desktop_config.json (Claude Desktop does not interpolate env vars into args). Forwarded by the local mcp-remote bridge as the Authorization header on every HTTP request.--header flag on claude mcp add. Sent on every MCP request.headers block in ~/.gemini/settings.json (env-var substitution supported). Sent on every MCP request.headers block in mcp.json. Sent on every MCP request.inputs prompt or workspace secret, referenced in headers. Sent on every MCP request.In every case the key is sent server-to-server over TLS and is never logged in plaintext by the MCP Server.
The MCP Server enforces the same rate limits and monthly quotas as the underlying API. A successful enrich_person invocation counts as one person.enrich call against your account.
When the limit is exceeded, the server returns a normalized error so the agent can back off gracefully:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 30 seconds.",
"request_id": "01HW6Q8K9XYZ...",
"retry_after_seconds": 30
}
}
See the Errors reference for the full error taxonomy.
To rotate a key:
Because the key only ever lives client-side, there is no MCP-Server-side cache to invalidate. The next request from each client will use the new value automatically.
| Symptom | Likely cause | Fix |
| -------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| 401 unauthorized on every call | Missing or malformed Authorization header | Confirm Bearer prefix and that the env var is exported in the shell that launched the client |
| 403 forbidden | API key lacks person.enrich entitlement | Contact your FullContact account team to enable it |
| 429 rate_limit_exceeded | Burst exceeded the per-second cap | Have the agent honor retry_after_seconds |
| Tool not visible in client | Server failed health check at startup | Restart the client and check its MCP logs (e.g., claude mcp list for Claude Code) |
enrich_person — Full input/output schema.Updated May 2026