Skip to main content
Glama

@mobile-reality/mdma-mcp

MCP (Model Context Protocol) server for MDMA. Exposes the MDMA spec, authoring prompts, package metadata, and live GitHub documentation to AI assistants.

Tools

Tool

Purpose

get-spec

Returns the full MDMA specification (component types, JSON schemas, binding syntax, external data sources with { source, params } refs and the rows / series / options kinds, authoring rules).

get-prompt

Returns a named MDMA prompt (mdma-author, mdma-reviewer, mdma-fixer). For mdma-author, accepts an optional variantId (e.g. anthropic/sonnet-5.5, openai/gpt-6-sol) to return the model-optimised variant — use list-prompt-variants to see all available ids.

list-prompt-variants

Returns all available MDMA_AUTHOR prompt variants (id, label, description) without the prompt content. Use the id with get-prompt to fetch the model-optimised prompt.

build-system-prompt

Generates a custom MDMA prompt from structured input (domain, components, fields, steps, business rules). Pass dataSources (an external data-source catalog of rows / series / options entries) to get the full system prompt with the catalog and the rule to reference data via { source, params }.

validate-prompt

Validates a custom prompt against MDMA conventions.

list-packages

Returns all MDMA npm packages with purpose, install command, usage example, and category.

list-docs

Returns the catalog of MDMA documentation files available for fetching from the public GitHub repo.

get-doc

Fetches the latest version of a doc from raw.githubusercontent.com/MobileReality/mdma. Supports an optional ref (branch, tag, or SHA).

Related MCP server: mcp-docs

Install

{
  "mcpServers": {
    "mdma": { "command": "npx", "args": ["@mobile-reality/mdma-mcp"] }
  }
}

Distribution venues

Places where MDMA's MCP server is published or should be published. Each venue has its own submission / update flow — when releasing a new version, check each one.

Venue

Identifier / URL

Notes

npm

@mobile-reality/mdma-mcp

Publish via pnpm publish --access public --no-git-checks.

Official MCP Registry

io.github.MobileReality/mdma

Published via mcp-publisher. Namespace is case-sensitive — must match GitHub's canonical capitalization.

Glama

MobileReality/mdma

Quality + Security scores auto-evaluated periodically. Docker build config lives in the Glama admin page — re-deploy + re-release when bumping.

awesome-mcp-servers

punkpeye/awesome-mcp-servers

Entry sits under Developer Tools alphabetically.

Smithery Skills

mobilereality/mdma

Skills surface — not the MCP surface (Smithery's MCP flow is HTTP-only, unusable for stdio).

MCP.so

mcp.so/server/mdma

Self-serve listing. Manual edit of Title / Description / Tags / Content on the Edit Server page. No versioned republish needed — just refresh the description if the tool set changes.

MCPB Desktop Extensions

Anthropic intake form

Partner queue at Anthropic. Bundle built locally; not shipped in this repo.

Release checklist — when bumping the version

Use this checklist every time you publish a new version (0.2.4 → 0.2.5, etc.).

1. Bump + test

  • Update version in package.json.

  • Update version string in src/index.ts (the McpServer({ version: ... }) call).

  • Update top-level version and packages[0].version in server.json.

  • Update top-level version and packages[0].version in manifest.json.

  • Add a changeset: pnpm changeset at repo root.

  • Run pnpm build && pnpm test && pnpm typecheck in this package.

  • Run pnpm smoke:pack in this package — it packs, installs the tarball into a clean directory and checks tools/list and get-spec over stdio; it must print PASS before you publish.

2. Publish to npm

  • pnpm publish --access public --no-git-checks from this directory.

  • Verify: npm view @mobile-reality/mdma-mcp version mcpName — both should match.

3. Publish to the MCP Registry

  • Ensure mcp-publisher is authenticated: mcp-publisher login github (re-auth if tokens expired).

  • mcp-publisher publish from this directory.

    • Alternative: run the "Publish to MCP Registry" workflow from the Actions tab on main after the npm publish. Interactive mcp-publisher login github fails when the organization restricts OAuth apps; the workflow uses GitHub OIDC instead.

  • Verify: curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.MobileReality/mdma" shows the new version.

Do not commit .mcpregistry_github_token / .mcpregistry_registry_token — they are in .gitignore. GitHub's push protection will block the push anyway; this is a belt-and-braces reminder.

4. Tag the release

git tag '@mobile-reality/mdma-mcp@<version>'
git push origin '@mobile-reality/mdma-mcp@<version>'

5. Build a fresh MCPB bundle (only if submitting a Desktop Extension update)

pnpm's virtual store (.pnpm/) gets stripped by mcpb pack, so you must build the bundle from a clean npm-installed directory or transitive deps (e.g. ajv) will be missing.

Output: <name>-<version>.mcpb. Test-install in Claude Desktop, then attach as a GitHub Release asset.

6. Glama — if tool descriptions or Dockerfile config changed

  • If you added / renamed / changed descriptions of tools: Glama's Quality score will re-evaluate on its next periodic scan. No manual trigger.

  • If packages[0].version bumped: go to the Glama admin page → update Build steps (npm install -g @mobile-reality/mdma-mcp@<version>) → Deploy → Make Release.

7. Downstream awareness

  • Update the MCP tools table in the root README.md if tools were added / renamed / removed.

  • Update this package's own tools table (above) the same way.

  • If tools changed: refresh the manual listing on MCP.so (Edit Server → Description / Content).

  • If a breaking change: note in the changeset; update consumers of createMdmaMcpServer() if any.

Troubleshooting

MCP Registry publish fails with 403 Forbidden

If the error says permission to publish: io.github.gitsad/*, io.github.MobileReality/*. Attempting to publish: io.github.mobilereality/mdma (lowercase mismatch): the registry is case-sensitive and your mcpName / server.json name must exactly match GitHub's canonical MobileReality capitalization. Fix both files and republish to npm (versions on npm are immutable).

If the error says permission to publish: io.github.gitsad/* (org missing entirely): your MobileReality GitHub membership is private. Make it public at https://github.com/orgs/MobileReality/people, then mcp-publisher logout && mcp-publisher login github to refresh the JWT.

MCPB .mcpb crashes on install in Claude Desktop

Usually "missing module" errors in the Developer tab logs. Cause: pnpm's nested .pnpm/ virtual store got stripped at pack time, so transitive deps are missing. Fix: build the bundle from a clean npm-installed directory (see step 5 above). Do not run mcpb pack directly against packages/mcp/node_modules.

Secrets leaking into the bundle

mcpb pack does not respect .gitignore. Any .mcpregistry_*_token file next to the manifest at pack time gets zipped into the .mcpb. Always delete these before packing, and prefer the /tmp/mcpb-build workflow above which has no tokens in its directory.

Files in this package

File

Purpose

Tracked?

src/

TypeScript source for the server + tools.

✅

dist/

Compiled JavaScript.

❌ (gitignored)

tests/

Vitest unit tests for tool logic.

✅

package.json

Contains the mcpName field required by the MCP Registry.

✅

server.json

MCP Registry manifest consumed by mcp-publisher.

✅

manifest.json

MCPB (Desktop Extension) manifest.

✅

icon.png

1024×1024 square icon for the MCPB submission.

✅

screenshots/

Screenshots bundled with the MCPB for the Claude Desktop install dialog.

✅

*.mcpb

Built Desktop Extension bundle (build artifact).

❌ (gitignored)

Available Tools

8 tools
build-system-prompt

Generates a custom MDMA prompt from structured input (domain, components, fields, steps). Returns only the custom prompt part — use buildSystemPrompt({ customPrompt }) in code to combine it with the base MDMA spec. When dataSources (an external data-source catalog) is passed, returns the full system prompt instead: base MDMA spec, the data-source catalog with the rule to reference it via { source, params }, and the custom part.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsNoMulti-step flow definitions — each step becomes a separate conversation turn
domainNoDomain context (e.g. "HR onboarding", "expense approval")
fieldsNoForm field definitions
componentsNoComponent types to use (e.g. ["form", "approval-gate", "webhook"])
dataSourcesNoExternal data-source catalog. Each entry: name, optional description, kind ("rows" for table.data, "series" for chart.data, "options" for form select options), optional columns [{ key, type: string|number|boolean|date, description?, sensitive? }], optional params [{ name, type: string|number|boolean, required?, allowed? }]. Names must be unique, but the same data may appear as a rows and a series entry under different names. The model is told to reference sources via { source, params } instead of generating rows.
businessRulesNoBusiness rules or constraints
get-doc

Fetches the latest version of an MDMA documentation file from the public GitHub repo (raw.githubusercontent.com/MobileReality/mdma) and returns its contents as text. Allowed paths: any entry from list-docs, plus any *.md file under "docs/" or "blueprints/". Defaults to the "main" branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoGit ref (branch, tag, or commit SHA). Defaults to "main".
pathYesRepo-relative path to the doc, e.g. "docs/getting-started/quick-start.md" or "blueprints/kyc-case/README.md"
get-prompt

Returns a named MDMA prompt (mdma-author, mdma-reviewer, or mdma-fixer). For mdma-author, pass an optional variantId (e.g. "anthropic/sonnet-5.5", "openai/gpt-6-sol") to get the model-optimised variant — use list-prompt-variants to see all available ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPrompt name: mdma-author, mdma-reviewer, or mdma-fixer
variantIdNoModel-specific variant id for mdma-author (e.g. "google/gemini-2.5-pro", "openai/gpt-5"). Falls back to the default variant if omitted or unknown.
get-spec

Returns the full MDMA specification: component types, schemas (as JSON Schema), binding syntax, external data sources ({ source, params } refs, the DataSourceDescriptor shape, and the rows / series / options kinds), and authoring rules

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

list-docsA

Returns the catalog of MDMA documentation files available for fetching from the public GitHub repo (path, title, description). Use this to discover what docs you can pass to get-doc.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It effectively describes the tool's behavior: it returns a catalog with specific fields (path, title, description) from a public GitHub repository. However, it doesn't mention potential limitations like rate limits, authentication requirements, or pagination behavior, which would be valuable for a read operation.

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?

The description is perfectly concise with two sentences that each serve distinct purposes: the first explains what the tool does and what it returns, the second explains when to use it. There is zero wasted language or redundancy.

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 zero-parameter read operation with no annotations and no output schema, the description provides good context about what the tool returns (catalog with path, title, description) and its relationship to other tools. However, without an output schema, additional details about the return format structure would be helpful for completeness.

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?

The tool has 0 parameters with 100% schema description coverage, so the baseline would be 4. The description appropriately doesn't waste space discussing parameters that don't exist, maintaining focus on the tool's purpose and usage.

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 clearly states the specific action ('Returns the catalog'), resource ('MDMA documentation files'), and scope ('available for fetching from the public GitHub repo'). It explicitly distinguishes from its sibling 'get-doc' by explaining this tool is for discovery while 'get-doc' is for fetching specific documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool ('Use this to discover what docs you can pass to get-doc') and names the alternative tool ('get-doc') for the subsequent action. This clearly establishes the workflow relationship between these two tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-packagesA

Returns all MDMA npm packages with their purpose, install command, usage example, and category

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While it states what data is returned, it doesn't describe important behavioral aspects like whether results are paginated, sorted, filtered, or cached. It also doesn't mention performance characteristics, error conditions, or authentication requirements.

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?

The description is a single, efficient sentence that communicates the core functionality without any wasted words. It's appropriately sized for a zero-parameter tool and front-loads the essential information about what the tool returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read operation with no output schema, the description adequately covers what data is returned. However, it lacks important contextual information about the return format (array structure, field types), potential limitations (number of packages, sorting), and how this tool relates to sibling tools in the MDMA ecosystem.

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?

The tool has zero parameters with 100% schema description coverage, so the baseline is 4. The description appropriately doesn't waste space discussing non-existent parameters, though it could theoretically mention that no filtering options are available.

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 clearly states the specific action ('Returns') and resource ('all MDMA npm packages'), including the exact data fields returned (purpose, install command, usage example, category). It distinguishes itself from siblings like 'list-docs' by focusing specifically on npm packages rather than documentation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when this tool is appropriate versus using 'get-doc' or 'list-docs', nor does it specify any prerequisites or contextual constraints for its use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-prompt-variants

Returns all available MDMA_AUTHOR prompt variants with their id, label, and description. Pass the id to get-prompt as variantId to retrieve the model-optimised prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

validate-prompt

Validates a custom prompt against MDMA conventions. Returns warnings for anti-patterns and suggestions for improvements.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesThe custom prompt text to validate

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.2
    • Changedbuild-system-prompt4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dataSources
        Added value: +{
        +  "description": "External data-source catalog. Each entry: name, optional description, kind (\"rows\" for table.data, \"series\" for chart.data, \"options\" for form select options), optional columns [{ key, type: string|number|boolean|date, description?, sensitive? }], optional params [{ name, type: string|number|boolean, required?, allowed? }]. Names must be unique, but the same data may appear as a rows and a series entry under different names. The model is told to reference sources via { source, params } instead of generating rows.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "columns": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "description": {
        +              "type": "string"
        +            },
        +            "key": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "sensitive": {
        +              "default": false,
        +              "type": "boolean"
        +            },
        +            "type": {
        +              "enum": [
        +                "string",
        +                "number",
        +                "boolean",
        +                "date"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "key",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "kind": {
        +        "enum": [
        +          "options",
        +          "rows",
        +          "series"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "params": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "allowed": {
        +              "items": {
        +                "type": [
        +                  "string",
        +                  "number",
        +                  "boolean"
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "name": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "required": {
        +              "default": false,
        +              "type": "boolean"
        +            },
        +            "type": {
        +              "enum": [
        +                "string",
        +                "number",
        +                "boolean"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / fields / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / steps / items / additionalProperties
        Added value: +false
    • Changedget-doc1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget-prompt2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / variantId
        Added value: +{
        +  "description": "Model-specific variant id for mdma-author (e.g. \"google/gemini-2.5-pro\", \"openai/gpt-5\"). Falls back to the default variant if omitted or unknown.",
        +  "type": "string"
        +}
    • Addedlist-prompt-variants
    • Changedvalidate-prompt1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  2. 7 tool updatesv0.1.0
    • First observedbuild-system-prompt
    • First observedget-doc
    • First observedget-prompt
    • First observedget-spec
    • First observedlist-docs
    • First observedlist-packages
    • First observedvalidate-prompt

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a distinct, non-overlapping purpose: build-system-prompt creates prompts, get-doc fetches documentation, get-prompt retrieves named prompts, get-spec provides the full specification, list-docs catalogs available docs, list-packages lists npm packages, and validate-prompt validates custom prompts. The descriptions clearly differentiate their functions, eliminating ambiguity.

Naming Consistency5/5

All tools follow a consistent verb_noun naming pattern (e.g., build-system-prompt, get-doc, list-docs, validate-prompt). The naming is uniform across all seven tools, with no mixing of conventions like camelCase or snake_case, making it highly predictable and readable.

Tool Count5/5

With 7 tools, the count is well-scoped for the MDMA domain, covering key operations like prompt generation, documentation retrieval, specification access, and validation. Each tool serves a clear purpose without redundancy, and the set feels complete yet not overwhelming for the server's scope.

Completeness4/5

The tool set provides comprehensive coverage for MDMA-related tasks, including prompt building, documentation access, specification retrieval, and validation. Minor gaps exist, such as no tools for updating or deleting prompts or docs, but agents can work around this using the available tools for core workflows like authoring and reviewing.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to discover, fetch, and search through Tambo documentation from docs.tambo.co. Provides intelligent content parsing with caching for improved performance when accessing technical documentation.
    4
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Generic MCP server that exposes Markdown documentation to LLMs, enabling them to search and answer questions about any software documentation.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for structured document management of markdown and YAML files, with RBAC, git-based approval workflows, and semantic search, enabling agents to read, edit, and maintain documents under governance.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server that exposes one or more documentation folders (Markdown, MDX, TXT) to AI agents, enabling listing, reading, and searching of documentation files.
    -