open-play-mcp
Provides searchable Open Play TypeScript SDK reference and developer documentation, including types, functions, signatures, summaries, and page content for integrating Open Play into TypeScript/web projects.
Provides searchable Open Play Unity C# SDK reference and developer documentation, including symbols, signatures, summaries, and integration guidance for adding Open Play to Unity games.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@open-play-mcphow do I sign a guest in with the Unity SDK?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
open-play-mcp
An MCP server that gives AI assistants the official Open Play developer documentation and SDK API (TypeScript and Unity C#). Ask "how do I sign a guest in?" and the answer comes from the real docs at https://open-play.b4klabs.dev/docs/, not from guesswork.
It is read-only: every tool only reads a documentation index.
Use the hosted server (easiest)
claude mcp add --transport http open-play https://open-play.b4klabs.dev/mcpCursor (~/.cursor/mcp.json) and VS Code (.vscode/mcp.json, under servers):
{ "mcpServers": { "open-play": { "url": "https://open-play.b4klabs.dev/mcp" } } }Claude Desktop (via the mcp-remote bridge):
{ "mcpServers": { "open-play": { "command": "npx", "args": ["-y", "mcp-remote", "https://open-play.b4klabs.dev/mcp"] } } }Related MCP server: Statly Docs MCP Server
Run it locally
The package is published to GitHub Packages. Add this line to your ~/.npmrc (or a project .npmrc) and use a
personal access token with read:packages:
@ferdiunal:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=<YOUR_TOKEN>Then register it with your client, for example:
claude mcp add open-play -- npx -y @ferdiunal/open-play-mcpor in a JSON config: { "command": "npx", "args": ["-y", "@ferdiunal/open-play-mcp"] }.
Tools, resources, prompt
Kind | Name | What it does |
tool |
| Searches the developer docs (English or Turkish) and returns the best pages with their URLs. |
tool |
| Returns one page as markdown by id, such as |
tool |
| Lists page ids and titles, optionally for one section. |
tool |
| Searches TypeScript and Unity SDK symbols by name, member, signature or summary. |
tool |
| Returns one SDK type or function with signature, summary and members ( |
resource |
| One doc page as markdown. |
prompt |
| A step-by-step plan to integrate a game ( |
Flags and environment
open-play-mcp stdio transport (default)
open-play-mcp --http <port> stateless Streamable HTTP on /mcp (0 = free port)
--docs-url <url> index URL (env OPEN_PLAY_MCP_INDEX_URL)
--index <path> use a local index.json only, no network
--host <addr> HTTP bind address (default 127.0.0.1)
--allowed-origins <list> comma-separated browser Origins allowed (default https://open-play.b4klabs.dev)
--trust-proxy take the client IP from X-Forwarded-For (only behind a trusted reverse proxy)
--rate-limit <n> requests per minute per client IP (default 60)
--burst <n> rate-limit burst size (default 20)Other environment variables: OPEN_PLAY_MCP_CACHE_DIR (default $XDG_CACHE_HOME/open-play-mcp, else ~/.cache/open-play-mcp).
HTTP mode serves POST /mcp and GET /healthz (index commit and generation time). It rejects browser requests whose
Origin is not allowed (403), bodies over 64 KB (413) and clients over the rate limit (429 with Retry-After).
Requests without an Origin header (CLI clients) are allowed. Logs are one JSON line per request on stderr, without bodies.
Self-host with Docker
docker run -d --name open-play-mcp --restart unless-stopped \
-p 127.0.0.1:18490:8080 ghcr.io/ferdiunal/open-play-mcp:0.2.0Put a reverse proxy in front for TLS. Behind a proxy that sets X-Forwarded-For (the image already starts with
--trust-proxy), make sure the proxy appends the real client address; do not expose the container port directly.
Nginx needs proxy_buffering off; and a long proxy_read_timeout for streamed responses. Build it yourself with
docker build -t open-play-mcp ..
How the index is refreshed
The docs site publishes one file, https://open-play.b4klabs.dev/docs/mcp/index.json, rebuilt with every docs release
(schemaVersion, generatedAt, commit, docs[], symbols[]). On start the server loads, in this order:
the live index (5 s timeout, validated;
schemaVersionmust be 1),the on-disk cache (used with
If-None-Match, so unchanged indexes cost a304),the snapshot bundled in the package (
snapshot/index.json).
Network problems never crash the server and are logged to stderr only (stdout carries the stdio protocol). In --http
mode the index is re-checked in the background every 15 minutes; a failed check keeps serving the previous index.
Maintainers refresh the bundled snapshot with npm run update-snapshot (optionally -- --from <file|url>).
Develop
npm ci
npm run build
npm test # includes a Docker smoke test when Docker is available (skip: OPEN_PLAY_MCP_SKIP_DOCKER=1)License
MIT © 2026 Ferdi ÜNAL
Available Tools
5 toolsget_sdk_symbolGet one SDK symbolA
Returns one SDK type or function with its signature, summary and members. The name is matched exactly (case-insensitive); a member can be addressed as 'Type.Member'.
| Name | Required | Description | Default |
|---|---|---|---|
| sdk | Yes | Which SDK to look in. | |
| name | Yes | Symbol name, e.g. 'CrxClient' or 'PlayerSession.SignInGuestAsync'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully covers the return payload (signature, summary, members) and the matching semantics, but it says nothing about behavior on an unknown name (error vs empty result), whether lookup is read-only, or what 'members' contains for a function versus a type.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the payload described first and the matching rules second. Nothing is redundant and no clause could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with a fully described schema and no output schema, the description covers the essentials: what is returned, how the key is matched, and how to address members. The only gap is failure behavior for a missing symbol, which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: name is matched exactly and case-insensitively, and a nested member can be addressed via the 'Type.Member' syntax. The sdk enum is already fully documented in the schema, so only the name semantics benefit from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Returns one SDK type or function' — plus what comes back (signature, summary, members). It is clearly a single-symbol lookup rather than a search, which differentiates it in spirit from search_sdk, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the exact, case-insensitive matching rule signals that the caller must already know the symbol name, which in turn implies search_sdk is the right tool when the name is unknown. There is no explicit when-to-use statement, no exclusion, and no pointer to the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsList Open Play doc pagesA
Lists documentation page ids and titles, optionally for one section (getting-started, auth, sdk, guides, realtime, plugins, reference, operations, panel).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Documentation language: "en" (default) or "tr" (the Turkish source). | en |
| section | No | Only this section. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It does disclose the return shape at a high level (ids and titles only, not page bodies), which is genuinely useful, but it says nothing about ordering, pagination, result limits, or whether the listing is complete across all sections.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the core behavior first and the optional filter second. The parenthetical list of all nine section values duplicates the schema enum and is the one element that does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read-only listing tool with no output schema, the description covers purpose, the filterable dimension, and the shape of the returned data. Ordering and pagination behavior are the main omissions, but they are minor for a simple index tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, and the description's enumeration of section values simply repeats the enum. The 'lang' parameter is never mentioned in the description at all, though the schema covers it adequately, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists documentation page ids and titles') and adds the scope qualifier of an optional section filter, so the agent knows this is a lightweight index rather than a content fetch. It does not name the sibling search_docs or read_doc, so differentiation must be inferred from the word 'ids and titles'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'optionally for one section' suggests browsing or enumerating pages, which contrasts implicitly with searching (search_docs) and reading (read_doc). There is no explicit when-to-use or when-not-to-use statement, and no guidance on choosing between listing and searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docRead an Open Play doc pageA
Returns the full markdown of one documentation page by its id (for example "auth/guest" or "guides/player-data"; ids come from search_docs or list_docs). Output is cut at 40000 characters with a link to the full page.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Documentation language: "en" (default) or "tr" (the Turkish source). | en |
| page | Yes | Page id such as 'auth/guest'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description usefully discloses the 40,000-character truncation behavior and that a link to the full page is provided. It does not discuss error behavior for invalid ids, permissions, or language fallback, but for a straightforward read tool the key behavioral caveat is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no wasted wording. The core purpose and the truncation caveat are both front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers purpose, id provenance, return format, and truncation. The remaining parameter detail is fully handled by the schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the lang enum and default. The description adds a little meaning by giving page id examples and their source, but it does not meaningfully expand on parameter behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns the full markdown of one documentation page by id. Naming the id source (search_docs or list_docs) and giving example ids makes it clearly distinct from the sibling search/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent when this tool applies by explaining that page ids come from search_docs or list_docs, which implies the retrieve-after-search workflow. It does not explicitly say when not to use it or name an alternative retrieval path, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch Open Play docsA
Searches the official Open Play developer documentation (guest sign-in, player data, plugins, realtime, store, panel...). Returns the best matching pages with a short description and the public URL. Follow up with read_doc.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Documentation language: "en" (default) or "tr" (the Turkish source). | en |
| limit | No | Maximum number of results (1-20, default 5). | |
| query | Yes | Search words, e.g. 'guest sign in' or 'save player data'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description still conveys a non-mutating documentation search and discloses the result shape: best-matching pages, short descriptions, and public URLs. It does not detail ranking or failure behavior, but those omissions are modest for a simple search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the action and scope, then describe outputs and the follow-up workflow. Every sentence contributes useful selection or invocation information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter search tool with a fully documented input schema and no output schema, the description supplies the documentation scope, returned fields, and next tool to use. That is sufficient for correct selection and invocation, with only minor sibling-routing gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and query, lang, and limit already have examples, defaults, enum values, and bounds. The description's topic examples clarify the searchable content but add no parameter semantics beyond the schema, making the baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: searching the official Open Play developer documentation, with representative topics establishing scope. The instruction to follow up with read_doc also distinguishes page discovery from full-document retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The topic list clarifies appropriate documentation queries, and 'Follow up with read_doc' provides an explicit next step in the workflow. It does not explain when to prefer list_docs or search_sdk, so alternative-based routing remains incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sdkSearch the Open Play SDK APIA
Searches the public API of the TypeScript SDK (@ferdiunal/open-play-ts) and the Unity C# SDK by symbol name, member name, signature and summary. Returns matching types/functions; use get_sdk_symbol for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| sdk | No | Only this SDK; default both. | |
| limit | No | Maximum number of results (1-20, default 5). | |
| query | Yes | Symbol or member words, e.g. 'signInGuest' or 'PlayerSession'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description must carry the behavioral burden. It does disclose the return shape at a high level (matching types/functions) and the fields matched against, but says nothing about result ordering, whether matches are fuzzy or exact, or what happens with zero hits — gaps for a search tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The search scope comes first and the sibling hand-off comes last, which is the correct front-loading for a search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly spends words on what is returned (matching types/functions). For a simple three-parameter read-only search this is close to sufficient; only match-quality/ranking behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds real meaning by saying the query matches against symbol name, member name, signature and summary — information the schema does not contain — which tells an agent it can search by partial signature or doc-summary text, not just identifiers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (searches) plus a clearly bounded resource: the public API of the TypeScript SDK (@ferdiunal/open-play-ts) and the Unity C# SDK. It also scopes matching to symbol name, member name, signature and summary, which separates it from the doc-oriented siblings and explicitly hands off to get_sdk_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the routing rule to get_sdk_symbol for full details, which is the main alternative an agent would confuse it with. It does not distinguish against search_docs (which presumably searches prose documentation rather than API symbols), so there is a small residual ambiguity but the core when-to-use context is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.2.0- First observed
get_sdk_symbol - First observed
list_docs - First observed
read_doc - First observed
search_docs - First observed
search_sdk
TDQS
Scored across 5 tools
The set splits cleanly into two pillars (documentation vs SDK reference) with a search→read/fetch pattern in each. The only mild overlap is search_docs vs list_docs, since both surface page ids, but descriptions make the distinction (ranked matches vs full enumeration) reasonably clear.
All names follow a consistent snake_case verb_noun pattern: search_docs, read_doc, list_docs, search_sdk, get_sdk_symbol. The doc/SDK suffix convention is applied predictably across both pillars.
Five tools is tightly scoped for a docs+SDK lookup server, and each earns its place (search/list/read for docs, search/get for SDK). No redundant or filler tools.
Both the documentation lifecycle (discover, enumerate, read) and the SDK symbol lifecycle (search, fetch details) are covered with no obvious dead ends. Minor gaps: no code-sample/example search, no version or changelog lookup, and read_doc truncation at 40k chars forces a fallback to external links.
Maintenance
Related MCP Connectors
Access and search Branch's official API documentation directly within any AI agent or client.
Tailor Platform for AI assistants: search, list and read the platform documentation.
Read-only search and Markdown pages from the OpenPlanr docs, for coding agents.
Docsy gives AI assistants current, version-specific documentation for libraries, frameworks and SDKs. Resolve library IDs and versions, then search and fetch focused official documentation with original source links using five read-only MCP tools. Hosted Streamable HTTP with OAuth 2.1 sign-in.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search documentation of packages and services to find implementation details, examples, and specifications.MIT
- AlicenseBqualityNot gradedmaintenanceProvides AI agents with access to Statly SDK and API documentation, enabling search across docs, retrieval of language-specific SDK references, code examples, and REST API information.4-

notifly-mcp-serverofficial
FlicenseNot gradedqualityCmaintenanceEnables AI agents to search Notifly documentation and SDK code examples for seamless integration.8 npm1-- AlicenseAqualityDmaintenanceEnables AI models to search, browse, and retrieve full content of OpenCode documentation pages.322 npm5MIT