Skip to main content
Glama

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/mcp

Cursor (~/.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-mcp

or in a JSON config: { "command": "npx", "args": ["-y", "@ferdiunal/open-play-mcp"] }.

Tools, resources, prompt

Kind

Name

What it does

tool

search_docs

Searches the developer docs (English or Turkish) and returns the best pages with their URLs.

tool

read_doc

Returns one page as markdown by id, such as auth/guest.

tool

list_docs

Lists page ids and titles, optionally for one section.

tool

search_sdk

Searches TypeScript and Unity SDK symbols by name, member, signature or summary.

tool

get_sdk_symbol

Returns one SDK type or function with signature, summary and members (Type.Member works).

resource

open-play-docs://<lang>/<page>

One doc page as markdown.

prompt

integrate_open_play

A step-by-step plan to integrate a game (web, unity or server).

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.0

Put 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:

  1. the live index (5 s timeout, validated; schemaVersion must be 1),

  2. the on-disk cache (used with If-None-Match, so unchanged indexes cost a 304),

  3. 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 tools
get_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'.

NameRequiredDescriptionDefault
sdkYesWhich SDK to look in.
nameYesSymbol name, e.g. 'CrxClient' or 'PlayerSession.SignInGuestAsync'.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
langNoDocumentation language: "en" (default) or "tr" (the Turkish source).en
sectionNoOnly this section.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
langNoDocumentation language: "en" (default) or "tr" (the Turkish source).en
pageYesPage id such as 'auth/guest'.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
langNoDocumentation language: "en" (default) or "tr" (the Turkish source).en
limitNoMaximum number of results (1-20, default 5).
queryYesSearch words, e.g. 'guest sign in' or 'save player data'.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
sdkNoOnly this SDK; default both.
limitNoMaximum number of results (1-20, default 5).
queryYesSymbol or member words, e.g. 'signInGuest' or 'PlayerSession'.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.2.0
    • First observedget_sdk_symbol
    • First observedlist_docs
    • First observedread_doc
    • First observedsearch_docs
    • First observedsearch_sdk

TDQS

A4/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers