{
  "markdown": "<p align=\"center\">\n    <a href=\"https://fingerprint.com\">\n        <picture>\n            <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://fingerprintjs.github.io/home/resources/logo_light.svg\" />\n            <source media=\"(prefers-color-scheme: light)\" srcset=\"https://fingerprintjs.github.io/home/resources/logo_dark.svg\" />\n            <img src=\"https://fingerprintjs.github.io/home/resources/logo_dark.svg\" alt=\"Fingerprint logo\" width=\"312px\" />\n        </picture>\n    </a>\n</p>\n\n# Fingerprint MCP Server\n\n## Features\n\n- Run locally, or use the managed instance at https://mcp.fpjs.io/mcp (in Claude, add it from the [connectors directory](https://claude.ai/customize/connectors))\n- **Event tools**: Retrieve and search identification and Automation Intelligence (edge) events with full smart signal data\n- **Management tools**: Manage workspace environments and API keys\n- **Onboarding prompt**: Guided setup for integrating Fingerprint into a project\n- Supports both **stdio** and **streamable-http** transports\n- Optional HTTPS with TLS certificates\n- OAuth2 login supported\n- **Public mode** for multi-tenant deployments (API keys passed via JWT bearer token)\n- **Tool filtering** to control which tools are exposed\n- Configurable via environment variables or CLI flags\n- Docker support for easy deployment\n\n## Installation\n\n### From Source\n\n```bash\ngo install github.com/fingerprintjs/fingerprint-mcp-server@latest\n```\n\n### Build Locally\n\n```bash\ngit clone https://github.com/fingerprintjs/fingerprint-mcp-server.git\ncd fingerprint-mcp-server\nmake build\n```\n\n`make build` runs `go generate` (to download the OpenAPI spec and generate schema files under `internal/schema/`) and then builds the binary.\n\n## Configuration\n\nThe server can be configured via CLI flags or environment variables:\n\n| CLI Flag                     | Environment Variable             | Default                          | Description                                                              |\n|------------------------------|----------------------------------|----------------------------------|--------------------------------------------------------------------------|\n| `--serverapikey`             | `FINGERPRINT_SERVER_API_KEY`     |                                  | Fingerprint Server API key (private mode)                                |\n| `--serverapiurl`             | `FINGERPRINT_SERVER_API_URL`     | api.fpjs.io                      | Custom Server API URL (omit to use default)                              |\n| `--managementapikey`         | `FINGERPRINT_MANAGEMENT_API_KEY` |                                  | Fingerprint Management API key (private mode)                            |\n| `--managementapiurl`         | `FINGERPRINT_MANAGEMENT_API_URL` | management-api.fpjs.io           | Custom Management API URL (omit to use default)                          |\n| `--region`                   | `FINGERPRINT_REGION`             | `us`                             | API region: `us`, `eu`, or `ap` (private mode)                           |\n| `--transport`                | `MCP_TRANSPORT`                  | `stdio`                          | Transport: `stdio` or `streamable-http`                                  |\n| `--port`                     | `MCP_PORT`                       | `8080`                           | Port for HTTP/HTTPS server                                               |\n| `--tlscert`                  | `MCP_TLS_CERT`                   |                                  | Path to TLS certificate file                                             |\n| `--tlskey`                   | `MCP_TLS_KEY`                    |                                  | Path to TLS private key file                                             |\n| `--readonly`                 | `MCP_READ_ONLY`                  | `false`                          | Only expose read tools (shorthand for `--tools` with read-only tools)    |\n| `--tools`                    | `MCP_TOOLS`                      |                                  | Comma-separated list of tool names to register (overrides `--readonly`)  |\n| `--publicmode`               | `MCP_PUBLIC`                     | `false`                          | Public mode: extract API keys from JWT bearer tokens                     |\n| `--authtoken`                | `MCP_AUTH_TOKEN`                 | (auto-generated in private mode) | Bearer token required to access the server (private mode)                |\n| `--jwtpublickey`             | `FINGERPRINT_PUBLIC_KEY`         |                                  | PEM-encoded ES256 public key for verifying Fingerprint-issued JWT tokens |\n| `--oauthresource`            | `OAUTH_RESOURCE`                 |                                  | URL of this server (for OAuth metadata)                                  |\n| `--oauthauthorizationserver` | `OAUTH_AUTH_SERVER`              |                                  | URL of the OAuth authorization server                                    |\n| `--jwksurl`                  | `JWKS_URL`                       |                                  | JWKS URL for JWT token verification in public mode                       |\n| `--openaiappschallengetoken` | `OPENAI_APPS_CHALLENGE_TOKEN`    |                                  | Domain verification token served at `/.well-known/openai-apps-challenge` |\n\n## Telemetry\n\nThis binary ships with telemetry disabled. There is no built-in analytics\nbackend and the default emitter is a no-op, so running the OSS binary\nsends nothing to anyone.\n\nThe server exposes a hook (`analytics.Emitter` in the `analytics`\npackage) that fires on each MCP method. Embedders who want product\nanalytics register their own emitter by importing this package as a\nlibrary and calling `WithAnalytics(emitter)` when constructing the\nserver. Fingerprint's hosted build (`mcp.fpjs.io`) does this with an\nAmplitude emitter, but that implementation lives in the private managed\nrepo, not here.\n\nIf you build your own emitter, the event shape is in\n`analytics/analytics.go`. The middleware fires one `mcp_method_called`\nevent per MCP method, gated on a non-empty `subscription_id` (so pre-auth\nmethods and the private-mode auth path stay silent regardless).\n\n## Request inspection\n\nEmbedders can register a second hook (`requestinspect.Inspector` in the\n`requestinspect` package) that receives HTTP request metadata — method,\nURL, original headers, and TCP peer address — for every request to the\n`/mcp` endpoint, useful for audit logging and traffic analysis. Register\nit with `WithRequestInspector(inspector)` when constructing the server.\nThe OSS binary configures no inspector, so nothing is collected.\n\nThe full contract (timing, fail-open behavior, read-only fields, stdio)\nis documented in `requestinspect/requestinspect.go`, the source of truth\nfor this hook. See `requestinspect/example_test.go` for a complete\nembedder-side implementation skeleton (bounded queue, background\ndelivery, header redaction, graceful drain).\n\n## Usage\n\n### Private mode vs. Public mode\n\nPrivate mode means the server runs with its API keys pre-configured (`FINGERPRINT_SERVER_API_KEY` and `FINGERPRINT_MANAGEMENT_API_KEY`). This mode is useful when you are running a local instance intended to be used within your organization: server automatically uses those specified in the config. In this mode, auth token (`MCP_AUTH_TOKEN`) is enforced to protect your instance of the MCP server from unauthenticated use.\n\nPublic mode is how https://mcp.fpjs.io/mcp is run. It is meant to be used in situations when a single instance can be used by different users from different organizations, each with their own API keys. In this mode, API keys are extracted from JWT access tokens that are issued by https://dashboard.fingerprint.com or by user following the OAuth2 flow.\n\n### Stdio Transport (Default)\n\n```bash\nexport FINGERPRINT_SERVER_API_KEY=your-secret-api-key\n./fingerprint-mcp-server\n```\n\n### Streamable HTTP Transport\n\n```bash\nexport FINGERPRINT_SERVER_API_KEY=your-secret-api-key\n./fingerprint-mcp-server --transport=streamable-http --port=8080\n```\n\nThe MCP endpoint will be available at `http://localhost:8080/mcp`.\n\n### HTTPS\n\nProvide TLS certificate and key files to enable HTTPS:\n\n```bash\n./fingerprint-mcp-server --transport=streamable-http \\\n  --tlscert=cert.pem --tlskey=key.pem\n```\n\n### Tool Filtering\n\nBy default, all tools are registered based on which API keys are configured. You can restrict which tools are exposed:\n\n```bash\n# Only expose read-only tools\n./fingerprint-mcp-server --readonly\n\n# Expose a specific set of tools\n./fingerprint-mcp-server --tools=get_event,search_events,list_environments\n```\n\nWhen `--tools` is set, it overrides `--readonly`.\n\n## Docker\n\n### Build the Image\n\n```bash\ndocker build -t fingerprint-mcp-server .\n```\n\n### Run with Stdio Transport\n\n```bash\ndocker run -i --rm \\\n  -e FINGERPRINT_SERVER_API_KEY=your-secret-api-key \\\n  fingerprint-mcp-server\n```\n\n### Run with Streamable HTTP Transport\n\n```bash\ndocker run -d --rm \\\n  -e FINGERPRINT_SERVER_API_KEY=your-secret-api-key \\\n  -e MCP_TRANSPORT=streamable-http \\\n  -p 8080:8080 \\\n  fingerprint-mcp-server\n```\n\n## MCP Client Configuration\n\n### Hosted endpoint (managed)\n\nThe managed instance at `https://mcp.fpjs.io/mcp` runs in public mode and authenticates each user via OAuth2. Nothing to run or configure.\n\n**In Claude**, add it from the connectors directory rather than as a custom connector: open [Customize > Connectors](https://claude.ai/customize/connectors), choose **Browse connectors**, and search for Fingerprint. The same catalog serves claude.ai, Desktop, mobile and Claude Code, so this only has to be done once per account.\n\nAdding it as a custom connector still works, but you have to name it yourself, and some characters in that name break tool discovery while the connector still reports as connected.\n\n**In other clients**, point them at the URL directly:\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=Fingerprint&config=eyJ1cmwiOiJodHRwczovL21jcC5mcGpzLmlvL21jcCIsInRyYW5zcG9ydCI6InN0cmVhbWFibGUtaHR0cCJ9)\n\n```json\n{\n  \"mcpServers\": {\n    \"fingerprint\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.fpjs.io/mcp\"\n    }\n  }\n}\n```\n\n### Self-hosted\n\nAdd to your Cursor/Claude Desktop/etc configuration file (e.g. `claude_desktop_config.json`):\n\n**Stdio Transport:**\n```json\n{\n  \"mcpServers\": {\n    \"fingerprint\": {\n      \"command\": \"/path/to/fingerprint-mcp-server\",\n      \"env\": {\n        \"FINGERPRINT_SERVER_API_KEY\": \"your-secret-api-key\"\n      }\n    }\n  }\n}\n```\n\n**Streamable HTTP Transport:**\n```json\n{\n  \"mcpServers\": {\n    \"fingerprint\": {\n      \"url\": \"https://url/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer <auth-token>\"\n      }\n    }\n  }\n}\n```\n\n**Docker with Stdio:**\n```json\n{\n  \"mcpServers\": {\n    \"fingerprint\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"-e\", \"FINGERPRINT_SERVER_API_KEY=your-secret-api-key\", \"fingerprint-mcp-server\"]\n    }\n  }\n}\n```\n\n## Available Tools\n\nEvent tools require a Server API key. Management tools require a Management API key. `get_current_time` needs no key and is always available. Write tools (create/update/delete) are hidden when `--readonly` is set or excluded via `--tools`.\n\n| Tool                 | Description                                                         |\n|----------------------|---------------------------------------------------------------------|\n| `get_current_time`   | Return the current date/time in UTC (and an optional IANA timezone) |\n| `get_event`          | Retrieve a specific event by ID (identification or edge)            |\n| `search_events`      | Search events with filters (visitor, IP, smart signals, time range) |\n| `list_environments`  | List workspace environments with pagination                         |\n| `get_api_key`        | Get details of a specific API key                                   |\n| `list_api_keys`      | List API keys with optional type/status/environment filters         |\n| `create_environment` | Create a new workspace environment                                  |\n| `update_environment` | Update an existing workspace environment                            |\n| `delete_environment` | Delete a workspace environment                                      |\n| `create_api_key`     | Create a new API key (public/secret/proxy)                          |\n| `update_api_key`     | Update an existing API key                                          |\n| `delete_api_key`     | Delete an API key (irreversible)                                    |\n\n## Available Resources\n\n- **`fingerprint://events/{event_id}`** — Returns full event data for a given event ID.\n- **`fingerprint://schemas/event`** — JSON Schema describing the event output structure.\n- **`fingerprint://schemas/environment`** — JSON Schema for environment objects.\n- **`fingerprint://schemas/api-key`** — JSON Schema for API key objects.\n\n## Available Prompts\n\n- **`onboarding`** — A guided walkthrough for integrating Fingerprint into a project, covering JavaScript Agent installation, API key setup, and verification steps.\n\n## License\n\nMIT\n",
  "bytes": 13216,
  "sha": "9c62727ca4ade51711c053cb85990ef274ed319daafe4dc15f5d12b2041949a2",
  "repo_slug": "fingerprintjs/fingerprint-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_fingerprintjs_fingerprint_mcp__8e4a45b9/readme"
}