Skip to main content
Glama
johnqh

ShapeShyft API MCP Server

by johnqh

ShapeShyft API MCP Server

MCP (Model Context Protocol) server that describes and drives the ShapeShyft API — the LLM structured-output platform where each configured endpoint becomes a REST URL that returns schema-conformant JSON.

It gives an AI assistant four things:

  • 61 tools covering every ShapeShyft API route — entities, LLM provider keys, projects, endpoints, analytics, rate limits, storage, users, and AI invocation.

  • 6 documentation resources describing the API itself (overview, routes, data model, worked examples, errors, providers) — readable with no credentials and no network call.

  • 3 prompt templates for common workflows: set up an endpoint, debug one, audit an entity.

  • The /shapeshyft-endpoint skill — a guided workflow for building, invoking, debugging, and auditing endpoints, shipped as a Claude Code plugin.

Package: @sudobility/shapeshyft_api_mcp (BUSL-1.1)

Installation

bun install

Related MCP server: Swagger MCP Server

Configuration

Getting a key

Create a personal API key once, at shapeshyft.ai → Dashboard → Settings → Personal API Keys → name it → Create key. It starts with shyft_ and does not expire. Hand it to the server and let it remember:

set_credentials({ apiKey: "shyft_...", persist: true })
// or, for an unattended agent that should act as the workspace:
set_credentials({ entityApiKey: "shyftent_...", persist: true })

That writes ~/.shapeshyft/config.json (mode 0600), so later sessions start authenticated with nothing else to configure.

Credential resolution

Highest priority first:

  1. An explicit tool argument (e.g. apiKey on invoke_endpoint)

  2. Environment variables

  3. ~/.shapeshyft/config.json

Variable

Required

Description

SHAPESHYFT_API_URL

No

Base URL of the API. Default https://api.shapeshyft.ai; use http://localhost:3000 for local dev

SHAPESHYFT_API_KEY

For admin tools

Personal API key (shyft_...) — preferred, never expires

SHAPESHYFT_AUTH_TOKEN

Only to create/reveal keys

Firebase ID token of the signed-in user

SHAPESHYFT_PROJECT_API_KEY

For AI tools

Project API key (sk_live_...)

SHAPESHYFT_ENTITY_SLUG

No

Default entity slug, so tools can omit entitySlug

SHAPESHYFT_ORG_PATH

No

Default organization path in AI URLs (defaults to the entity slug)

SHAPESHYFT_CONFIG_PATH

No

Override the config file location

The server starts with no credentials at all — the documentation resources, the provider catalog, and the health checks are public. Tools that need a credential return a clear error saying how to get one.

Two key types, different jobs. shyft_... is a personal key that authenticates you against the admin routes. sk_live_... is a project key that lets callers invoke one project's AI endpoints. Creating and revealing personal keys is the one thing a personal key cannot do — that needs a Firebase ID token, so a leaked key cannot mint more.

This makes the MCP tools, the documentation resources, and the /shapeshyft-endpoint skill available in any project.

# Register this repo as a marketplace, then install the plugin from it
claude plugin marketplace add /path/to/shapeshyft_api_mcp
claude plugin install shapeshyft@shapeshyft

Verify with claude plugin details shapeshyft@shapeshyft, which lists the skill and the MCP server.

The plugin is installed as a copy under ~/.claude/plugins/cache/shapeshyft/, so edits in this repo do not take effect until you refresh both the marketplace and the plugin:

claude plugin marketplace update shapeshyft
claude plugin update shapeshyft@shapeshyft

The copy includes node_modules, so run bun install here before installing or updating — the server runs straight from src/index.ts.

The plugin is defined by:

  • .claude-plugin/plugin.json — plugin metadata

  • .claude-plugin/marketplace.json — marketplace entry

  • .mcp.json — MCP server declaration (reads SHAPESHYFT_* from your environment)

  • skills/shapeshyft-endpoint/ — the /shapeshyft-endpoint skill

Option B: Add the MCP server manually

Add to .claude/settings.json (or .mcp.json):

{
  "mcpServers": {
    "shapeshyft-api": {
      "command": "bun",
      "args": ["run", "/path/to/shapeshyft_api_mcp/src/index.ts"]
    }
  }
}

No credentials are needed in the config: run set_credentials({ apiKey, persist: true }) once and the key lives in ~/.shapeshyft/config.json instead of a settings file that might be committed. Environment variables still work, and take precedence.

Tools

Documentation and health

Tool

Purpose

describe_shapeshyft_api

Read the bundled API docs (overview, routes, data-model, examples, errors, providers)

get_configuration

Show the effective API URL, defaults, and which credentials are present (redacted)

set_credentials

Set the API key, token, project key, URL, or defaults — with persist to save them

clear_stored_credentials

Remove saved secrets from the config file, keeping preferences

check_api_health

GET /health, or /health/ready for the database check

get_api_info

GET / — name, version, status

Identity and personal API keys

Tool

Purpose

get_current_user

GET /users/me — who the current credential belongs to, and how it authenticated

list_api_keys, get_api_key

Key metadata (never the secret)

create_api_key, reveal_api_key

Mint or re-read a key — Firebase token required

update_api_key

Rename, or is_active: false to pause a key reversibly

delete_api_key

Permanent revocation

Providers (public)

list_providers, get_provider, list_provider_models

Model entries carry capabilities (vision/audio/video input, media output, web search) and pricing in cents — check them before setting a model on an endpoint.

AI invocation (project API key)

Tool

Purpose

invoke_endpoint

Execute an endpoint → { output, usage, generated_media? }

preview_endpoint_prompt

Build the prompt without calling the LLM — free, ideal for debugging

Entities, members, invitations (Firebase auth)

list_entities, get_entity, create_entity, update_entity, delete_entity, list_entity_members, update_member_role, remove_entity_member, list_entity_invitations, invite_member, renew_invitation, cancel_invitation, list_my_invitations, accept_invitation, decline_invitation

LLM provider keys

list_llm_keys, get_llm_key, create_llm_key, update_llm_key, delete_llm_key

Projects

list_projects, get_project, create_project, update_project, delete_project, get_project_api_key, refresh_project_api_key

Endpoints

list_endpoints, get_endpoint, create_endpoint, update_endpoint, delete_endpoint

Analytics, rate limits, storage, users

get_analytics · get_rate_limits, get_rate_limit_history · get_storage_config, set_storage_config, update_storage_config, delete_storage_config · get_user_info, get_user_subscription, get_user_settings, update_user_settings

Resources

URI

Contents

shapeshyft://api/overview

Architecture, object hierarchy, auth schemes, invocation lifecycle, limits

shapeshyft://api/routes

Every route with method, auth, parameters, and response

shapeshyft://api/data-model

Object shapes, rate limit tiers, database tables

shapeshyft://api/examples

End-to-end setup, curl/TypeScript/Python, schema patterns, multimodal

shapeshyft://api/errors

Error envelope, status codes, troubleshooting

shapeshyft://api/providers

Provider list, model selection, multimodal pipeline, transcription

Prompts

setup_structured_endpoint · debug_endpoint · audit_entity

Example session

describe_shapeshyft_api({ section: "examples" })
list_entities()                                  -> entitySlug "acme"
create_llm_key({ key_name: "Prod Anthropic", provider: "anthropic", api_key: "sk-ant-..." })
create_project({ project_name: "support-tools", display_name: "Support Tools" })
create_endpoint({ projectId, endpoint_name: "classify-ticket", llm_key_id,
                  model: "claude-sonnet-4-6-20260217",
                  instructions: "Classify the ticket and judge sentiment.",
                  output_schema: { type: "object", properties: {
                    category:  { type: "string", enum: ["billing", "bug", "feature", "other"] },
                    sentiment: { type: "string", enum: ["positive", "neutral", "negative"] }
                  }, required: ["category", "sentiment"] } })
get_project_api_key({ projectId })
invoke_endpoint({ projectName: "support-tools", endpointName: "classify-ticket",
                  input: { text: "You billed me twice this month." } })
  -> { output: { category: "billing", sentiment: "negative" },
       usage: { tokens_input: 312, tokens_output: 18, latency_ms: 940,
                estimated_cost_cents: 0.11 } }

The /shapeshyft-endpoint skill

Installed with the plugin, the skill routes a request into one of four flows and checks credentials before touching anything:

Flow

Covers

A — Build

task → output schema → provider key → model → project → endpoint → verified invocation

B — Invoke

resolve names, run input through an endpoint, report output plus cost and latency

C — Debug

map 401/404/405/429 to a cause; fix schema-conformance and quality problems

D — Audit

inventory keys, projects, and endpoints; review spend, failures, and quota headroom

Usage:

/shapeshyft-endpoint

Or just describe what you want:

"Turn this classification prompt into an API" "My endpoint keeps returning the wrong category" "What are my ShapeShyft endpoints costing this month?"

Bundled references:

  • skills/shapeshyft-endpoint/references/creating-endpoints.md — create_endpoint field reference and six worked recipes, each pairing an input payload with its schemas and response

  • skills/shapeshyft-endpoint/references/schema-design.md — output schemas models actually satisfy

  • skills/shapeshyft-endpoint/references/model-selection.md — picking a provider and model from capabilities and pricing

Development

bun run dev        # Run the server over stdio
bun run build      # Bundle to dist/index.js
bun run typecheck  # TypeScript check
bun run verify     # typecheck + build
bun run start      # Run the production bundle

Validate the plugin and skill after editing them:

claude plugin validate .        # marketplace + plugin manifests
claude plugin validate skills   # skill frontmatter and structure

Project structure

src/
├── index.ts            # Entry: env config, registration, stdio transport
├── client.ts           # HTTP client: auth-mode routing, envelope unwrapping
├── prompts.ts          # Prompt templates
├── resources/          # Embedded API documentation (resources + describe_shapeshyft_api)
└── tools/              # One module per route family

skills/
└── shapeshyft-endpoint/
    ├── SKILL.md                        # The /shapeshyft-endpoint skill
    └── references/
        ├── creating-endpoints.md       # create_endpoint recipes with payload examples
        ├── schema-design.md            # Output schema design guide
        └── model-selection.md          # Provider and model selection guide

.claude-plugin/         # plugin.json + marketplace.json
.mcp.json               # MCP server declaration used by the plugin

Architecture

AI assistant (Claude Code / Claude Desktop)
    ↕ stdio (MCP protocol)
ShapeShyft API MCP server (this project)
    ↕ HTTP / REST
ShapeShyft API (Hono on Bun, PostgreSQL)
    ↕
10 LLM providers (OpenAI, Anthropic, Gemini, Groq, Mistral, xAI, DeepSeek,
                  Perplexity, Cohere, LM Studio)

The server is a thin HTTP client. Each tool maps to one REST route, and the right Authorization header is chosen from the route family: a Firebase ID token for admin routes, the project API key for /api/v1/ai/*, nothing for public routes. Responses are unwrapped from the { success, data, timestamp } envelope; failures come back as MCP tool errors carrying the HTTP status and any provider details.

  • shapeshyft_api — the Hono backend this server wraps

  • shapeshyft_types — shared TypeScript type definitions

  • shapeshyft_client — API client hooks for web/native apps

  • shapeshyft_lib — business logic stores

  • shapeshyft_app — React web frontend

License

BUSL-1.1

Related MCP Connectors

Related MCP Servers