{
  "name": "Layer",
  "description": "Layer is the AI platform for creative teams in games and entertainment. These MCP servers expose asset generation, custom style training, node-based workflows, and workspace administration as tools any MCP client can call.",
  "vendor": "Layer",
  "homepage": "https://www.layer.ai",
  "documentation_url": "https://www.layer.ai/docs/mcp",
  "specification": "https://modelcontextprotocol.io",
  "servers": [
    {
      "name": "Layer MCP Server",
      "id": "creative",
      "description": "Generate and edit images, video, 3D, and audio; run Blueprint workflows; train styles; assemble video timelines; upload and score files.",
      "url": "https://mcp.app.layer.ai/mcp",
      "transport": "streamable-http",
      "documentation_url": "https://www.layer.ai/docs/mcp",
      "setup_url": "https://www.layer.ai/docs/mcp/setup",
      "instructions": "IMPORTANT: Call tool `get_instructions` first for general platform guidance.\n\nIf any tool call fails with an authentication error (401 Unauthorized), tell the user they need to connect their Layer account — they should complete the OAuth flow in their MCP client settings.",
      "authorization": {
        "type": "oauth2",
        "flow": "authorization_code",
        "pkce_required": true,
        "dynamic_client_registration": true,
        "authorization_servers": [
          "https://auth.app.layer.ai/"
        ],
        "authorization_server_metadata": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
        "scopes_supported": [
          "openid",
          "profile",
          "email",
          "offline_access"
        ],
        "description": "Unauthenticated requests return 401 with a `WWW-Authenticate: Bearer resource_metadata=…` challenge pointing at the RFC 9728 protected-resource metadata for that server. Follow it to the authorization server, register dynamically, and run the authorization-code + PKCE flow.",
        "protected_resource_metadata": "https://mcp.app.layer.ai/.well-known/oauth-protected-resource/mcp"
      },
      "tool_count": 36,
      "tools": [
        {
          "name": "cancel_inference",
          "description": "Request cancellation of an in-flight inference launched with execute_forge.\nFire-and-forget: returns immediately after signalling the run to stop; poll get_forge_run for the\neventual CANCELLED status. A run that already COMPLETED can no longer be cancelled and errors with\nINFERENCE_ALREADY_COMPLETE; the other terminal states are idempotent no-ops.\nPass the `inference_id` that execute_forge returned."
        },
        {
          "name": "cancel_training_run",
          "description": "Cancel an in-flight training run and release any reserved Creative Units.\n\nOnly runs that are initializing or running can be cancelled. Errors:\ntraining-run-not-found, invalid-status (run already finished)."
        },
        {
          "name": "cancel_workflow_run",
          "description": "Cancel a running workflow. Stops generation immediately. Creative Units reserved but not yet consumed are released. Already-completed steps are not refunded.\n\nFor multi-step workflow guidance, call get_workflow_instructions."
        },
        {
          "name": "create_reference_set",
          "description": "Create a new reference set from a list of image or video files in the workspace.\n\nA reference set is a curated collection of image or video assets used to train a LoRA style model.\nCall this when the user wants to start training from assets they have already uploaded.\nAfter creating the reference set, call draft_captions then start_training.\n\nCover thumbnails: pass cover_file_ids to choose them explicitly, or omit it to auto-pick the\nfirst few image files. The output's cover_count reports how many were set.\n\nErrors: invalid-dataset (no usable assets / all files foreign to the workspace),\ninvalid-session (the session does not belong to the workspace),\npermission errors propagated as-is.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "estimate_forge_price",
          "description": "Estimate the Creative Units price of a forge run before executing it.\n\nRequires either a `base_model_id` or at least one reference set; passing neither is an error.\nPrices through the same reference-set translation and model selection as `execute_forge`, so\nthe returned price matches what execution charges for identical inputs. Executes nothing.\n\nFor forge lifecycle guidance, call get_forge_instructions."
        },
        {
          "name": "estimate_training_price",
          "description": "Estimate the Creative Units cost of training a LoRA for a reference set.\n\nRead-only. Resolves the base model the same way start_training would, then prices the run.\nErrors: unknown-base-model (id not trainable), invalid-dataset (reference set not found).\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "estimate_video_timeline_price",
          "description": "Estimate the Creative Units price of a video editor render without rendering anything.\n\nAuthor the timeline exactly as for `render_video_timeline`. Prices through the same estimator the\nrender charges against, so the price matches for identical inputs. Returns the price plus the\nworkspace balance. Produces no file."
        },
        {
          "name": "estimate_workflow_price",
          "description": "Estimate the Creative Units price of running a workflow before executing it.\n\nUse this tool to check price and verify the workspace has sufficient Creative Units\nbalance before executing. Does not execute anything.\n\nFor multi-step workflow guidance, call get_workflow_instructions."
        },
        {
          "name": "execute_forge",
          "description": "Execute a forge run to generate images, videos, 3D models, or audio.\n\nPass a `base_model_id`, at least one entry in `reference_sets`, or both. With reference sets\nand no base model, a compatible model is picked automatically from the sets.\n\nReturns immediately with an inference ID, which can be polled with `get_forge_run` for results.\n\nCall `get_forge_instructions` first for full forge lifecycle guidance."
        },
        {
          "name": "execute_workflow",
          "description": "Execute a workflow run to produce images or videos via a multi-step pipeline.\n\nReturns immediately with a run ID. Poll with `get_workflow_run` for results.\n\nCall `get_workflow_instructions` first for full workflow lifecycle guidance."
        },
        {
          "name": "get_base_model",
          "description": "Get full details for a specific base model.\n\nReturns capabilities, timing, pricing, and prompt format information\nsourced from the model registry (not a Style row).\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "get_base_model_recommendations",
          "description": "Get curated model recommendations for common game asset creation tasks.\n\nReturns guidance on which base models to use for specific use cases, organized by modality\n(image, video, 3D, audio) and task type. Models are returned as base_model_id strings,\nsourced from the registry and filtered by workspace feature config — no Style table query,\nso every enabled base model appears regardless of workspace Style links.\n\nThis taxonomy ignores reference-set fit. When the user has reference sets, pass them to\nexecute_forge without a base_model_id and let auto-pick rank models for those sets.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "get_file_scores",
          "description": "Read the output scoring verdicts recorded against one file.\n\nReturns the current score per rule (0-100 with the judge's rationale), plus the headline\nscore stamped on the file by whichever rule its scope nominated — that stamp is what the\nlibrary badge and score sort read.\n\nAn empty `scores` list means the file has not been judged yet, not that it scored zero.\nCall score_files to have it judged; scoring is asynchronous, so poll this afterwards."
        },
        {
          "name": "get_forge_instructions",
          "description": "Get detailed instructions for running forge (direct model execution).\nCall this before using forge tools. Covers the full generation lifecycle, guidance files, polling, and limits.\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "get_forge_run",
          "description": "Check status of an inference run launched with execute_forge.\nReturns generated asset URLs and metadata when complete. Poll at the suggested interval.\nPass the `inference_id` that execute_forge returned.\n\nIMPORTANT: Call `get_forge_instructions` for full lifecycle guidance."
        },
        {
          "name": "get_generation_run",
          "description": "Check status of a generation run launched with a generation tool (e.g. render_video_timeline).\nReturns the output asset URLs and metadata when complete.\nPass the `generation_id` that the launch tool returned."
        },
        {
          "name": "get_instructions",
          "description": "Get general instructions for using the Layer MCP server.\nALWAYS call this tool first in order to understand the platform, available tools, and common patterns.\nAll other tools reference this for general guidance."
        },
        {
          "name": "get_project",
          "description": "Get details for a single project in a workspace.\n\nReturns the project's name, status, linked object count, description, instructions,\nand the user-explicit linked library objects (paginated, newest first). Implicit\nlinks (auto-added via generation workflows) are counted but not returned here.\nUse list_projects to discover project ids."
        },
        {
          "name": "get_reference_set",
          "description": "Fetch everything about a reference set: its metadata and all attached files.\n\nA reference set is a curated collection of image or video files (optionally captioned) used to\ntrain a LoRA style model. Call this to inspect, analyze, or describe a reference set the user\n@-mentions — it returns the set's name, description, category, and status, plus every attached\nfile with its download URL, content type, caption, and multi-view tag.\n\nUse the returned `file_id` / `url` to act on individual files (e.g. analyze_media, or as a\nreference input for generation). Do not surface raw UUIDs or download URLs in prose.\n\nFor forge lifecycle guidance, call get_forge_instructions."
        },
        {
          "name": "get_trained_model",
          "description": "Retrieve the trained LoRA for a completed training run. Gated on\nterminal-success — if the run is not complete, raises so the caller polls first."
        },
        {
          "name": "get_training_status",
          "description": "Poll a training run. Maps run status to in_progress / terminal_success /\nterminal_failure. Do not fetch the trained model until terminal_success."
        },
        {
          "name": "get_workflow_instructions",
          "description": "Get detailed instructions for running generation workflows.\nCall this before using workflow tools. Covers the full generation lifecycle, file inputs, polling, and pricing.\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "get_workflow_run",
          "description": "Check status of a running workflow.\nReturns step information while in progress. Can be used to display a compact progress summary, and to display the completed/total ratio.\nReturns full results (asset URLs, metadata, price) only when generation is complete. Poll at the suggested interval.\n\nFor multi-step workflow guidance, call get_workflow_instructions."
        },
        {
          "name": "get_workspace",
          "description": "Get details for a single workspace including Creative Units balance.\n\nReturns workspace id, slug, display name, balance, reserved units, available balance,\nand last activity timestamp. The authenticated user must be a member of the workspace.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "list_base_models",
          "description": "List the base AI models available for generation in a workspace.\n\nSourced from the model registry and the workspace's feature config — not the Style table —\nso every enabled base model is listed. Results are sorted alphabetically by display name,\nnot by quality or curator preference.\n\nTo choose a model for a task, call `get_base_model_recommendations` first and use a\n`base_model_id` from that response. Use this tool for lookup, pricing, or capability\nfiltering after you already have an id — not as a substitute for recommendations.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "list_output_scoring_rules",
          "description": "List the output scoring rules in force for a workspace or project.\n\nEach rule is a studio's own standard that generated assets are judged against, scored\n0-100. Read this before score_files to know what a scope asks and which rule ids you can\nnarrow to, and after get_file_scores to interpret a score — the same number means\ndifferent things under different rules.\n\nRules cannot be authored here; they are configured in workspace or project settings."
        },
        {
          "name": "list_projects",
          "description": "List projects in a workspace with their name, status, and linked object count.\n\nProjects group related library objects (images, videos, models, etc.) into a shared\ncollection. By default only active projects are returned; set filter.include_archived\nto also include archived projects. Deleted projects are never returned."
        },
        {
          "name": "list_reference_sets",
          "description": "List the reference sets (the user's trained styles / custom models) for a workspace.\n\nReturns compact summaries; optional fulltext matches on name/description. Only sets that are\nready to generate with are listed: archived sets, and empty ones — no usable input files, no\nactive finetune, and no prompt fragments — are omitted.\n\nFor forge lifecycle guidance, call get_forge_instructions."
        },
        {
          "name": "list_training_runs",
          "description": "List training runs for the workspace (filterable by reference set and state).\n\nUse this to answer \"how's my training going?\" without a specific run id.\nResults are paginated."
        },
        {
          "name": "list_workflows",
          "description": "List available generation workflows (published blueprints) in a workspace.\n\nReturns workflows with their input/output schemas so you can discover\nwhat generation capabilities are available.\n\nFor multi-step workflow guidance, call get_workflow_instructions."
        },
        {
          "name": "list_workspaces",
          "description": "List every workspace the current user belongs to.\n\nReturns workspace id, slug, display name, and last activity timestamp for each\nworkspace, ordered by most recently active first. Does NOT include Creative Units\nbalance — call `get_workspace` with a workspace_id to get the balance for one\nworkspace (do not call it for every workspace just to compare balances).\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "render_video_timeline",
          "description": "Edit assets the user already has into ONE finished video — sequence clips, add transitions, overlay\ntext or logos, layer audio. This is editing, not generating new content.\n\nEstimate with `estimate_video_timeline_price` first. The render is asynchronous; check the returned\n`generation_id` with `get_generation_run`.\n\nPass `timeline_object_id` to update that board timeline in place; omit it to place a new one."
        },
        {
          "name": "request_file_upload_url",
          "description": "Request a signed URL to upload a file directly to storage.\n\nReturns a signed upload URL and file_id. After receiving the URL, perform\nthe upload using this two-step resumable upload flow:\n\nStep 1 — Initiate the resumable upload:\n  POST {upload_url}\n  Headers:\n    Content-Type: {content_type}\n    x-goog-resumable: start\n  Body: (empty)\n  Response: 201 with Location header containing the session URI.\n\nStep 2 — Upload file content:\n  PUT {session_uri_from_Location_header}\n  Headers:\n    Content-Type: {content_type}\n  Body: raw file bytes\n  Response: 200 on success.\n\nAfter upload completes, use the returned file_id as input to generation tools.\nThe upload URL expires in 15 minutes. Maximum file size: 64 MB.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "score_files",
          "description": "Score files against the workspace's (and optionally a project's) output scoring rules.\n\nEach rule is a studio's own standard — \"does this read as our art direction?\" — judged by a\nvision model against the rule's prompt and reference images, returning 0-100 with a\nrationale. Use list_output_scoring_rules to see what a scope asks; use get_file_scores to\nread the verdicts back.\n\nAsynchronous and billed: returns as soon as the run is queued, and every (file, rule) pair\nis a model call that spends creative units. Poll get_file_scores for the results — a large\nrequest takes a few minutes. Scoring the same file again is allowed and appends a fresh\nverdict rather than replacing the old one."
        },
        {
          "name": "start_training",
          "description": "Submit a LoRA training job for a reference set.\n\nAsynchronous: returns a training_run_id immediately. Errors: invalid-dataset\n(too few images / missing captions), unknown-base-model (id not trainable),\nunsupported-training-framework (framework not available for this base model),\nmodel-disabled (base model disabled for this workspace), insufficient-balance\n(not enough Creative Units), and internal errors when the run fails to start.\nOther coded errors propagate unchanged.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "upload_file",
          "description": "Upload an image or video file from a URL for use as workflow input.\n\nReturns a file_id to pass as input to workflows or forge runs. Upload files before\nexecuting a generation — uploaded files can be reused across multiple runs.\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        }
      ],
      "resources": [
        {
          "uri": "ui://layer/execute-generation",
          "name": "execute-generation",
          "mimeType": "text/html;profile=mcp-app"
        }
      ]
    },
    {
      "name": "Layer Management MCP Server",
      "id": "management",
      "description": "Administer a workspace: projects, groups, members, roles, usage limits, and Creative Unit consumption. Kept separate so admin tools do not crowd the creative toolset.",
      "url": "https://mcp.app.layer.ai/mcp-management",
      "transport": "streamable-http",
      "documentation_url": "https://www.layer.ai/docs/mcp/management",
      "setup_url": "https://www.layer.ai/docs/mcp/management/setup",
      "instructions": "Layer workspace management server. Use these tools to administer a workspace: invite, suspend, and reactivate members; create, update, and delete projects; add and remove project members; and review Creative Units usage. Start with list_workspaces to find a workspace id, then list_workspace_members / list_projects to find the members and projects to act on. Every operation runs as your Layer user and is subject to your workspace role.\n\nIf any tool call fails with an authentication error (401 Unauthorized), tell the user they need to connect their Layer account by completing the OAuth flow in their MCP client settings.",
      "authorization": {
        "type": "oauth2",
        "flow": "authorization_code",
        "pkce_required": true,
        "dynamic_client_registration": true,
        "authorization_servers": [
          "https://auth.app.layer.ai/"
        ],
        "authorization_server_metadata": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
        "scopes_supported": [
          "openid",
          "profile",
          "email",
          "offline_access"
        ],
        "description": "Unauthenticated requests return 401 with a `WWW-Authenticate: Bearer resource_metadata=…` challenge pointing at the RFC 9728 protected-resource metadata for that server. Follow it to the authorization server, register dynamically, and run the authorization-code + PKCE flow.",
        "protected_resource_metadata": "https://mcp.app.layer.ai/.well-known/oauth-protected-resource/mcp"
      },
      "tool_count": 22,
      "tools": [
        {
          "name": "add_group_member",
          "description": "Add a workspace member to a group by email (they must already be a workspace member).\n\nFails for identity-provider-managed groups. Requires workspace billing-admin permission."
        },
        {
          "name": "add_project_members",
          "description": "Add existing workspace members to a project by email.\n\nEvery email must already be an active member of the project's workspace (invite them\nto the workspace first with invite_member). The add is all-or-nothing and idempotent.\nRequires workspace project-edit permission plus being a project member (workspace\nadmins are exempt)."
        },
        {
          "name": "create_group",
          "description": "Create a workspace group, optionally granting its members a role.\n\nMembers added to a role-bearing group inherit that role's permissions. Requires\nworkspace billing-admin permission."
        },
        {
          "name": "create_project",
          "description": "Create a new project in a workspace.\n\nProjects group related library objects into a shared collection. The caller is\nadded as the project's first member. Fails if a project with the same name already\nexists in the workspace or the workspace project limit is reached. Requires\nworkspace project-edit permission."
        },
        {
          "name": "delete_group",
          "description": "Delete a workspace group, revoking its role and cap from members.\n\nFails for identity-provider-managed groups (delete them in the IdP). Requires workspace\nbilling-admin permission."
        },
        {
          "name": "delete_project",
          "description": "Delete a project (soft-delete: it is removed from listings and can't be used).\n\nOnly the project's creator or a workspace admin may delete it, and public projects\ncannot be deleted. Requires workspace project-delete (or admin-settings) permission."
        },
        {
          "name": "get_project",
          "description": "Get details for a single project in a workspace.\n\nReturns the project's name, status, linked object count, description, instructions,\nand the user-explicit linked library objects (paginated, newest first). Implicit\nlinks (auto-added via generation workflows) are counted but not returned here.\nUse list_projects to discover project ids."
        },
        {
          "name": "get_workspace_usage",
          "description": "Report a workspace's Creative Units balance and recent consumption.\n\nReturns the current balance (available and reserved) plus the total and per-day\nCreative Units consumed over the last `days` days (default 30). Use this to see how\nmuch a workspace has spent and how much it has left. Requires workspace billing\n(member) permission."
        },
        {
          "name": "invite_member",
          "description": "Invite a user to a workspace by email, creating the Layer user if needed.\n\nThe invited user is added with the given role (default: member) and an ACTIVE\nmembership; they receive an invite notification. Fails if the workspace has\ninvites disabled or the user is already a member. Requires workspace member-edit\npermission."
        },
        {
          "name": "list_group_members",
          "description": "List a group's members with their email and status.\n\nRequires workspace billing-admin permission on the group's workspace."
        },
        {
          "name": "list_groups",
          "description": "List a workspace's groups with their name and granted role.\n\nGroups bundle members under a shared workspace role and/or a Creative-Units cap. Use\nthis to find group ids for the other group tools. Requires workspace billing-admin."
        },
        {
          "name": "list_projects",
          "description": "List projects in a workspace with their name, status, and linked object count.\n\nProjects group related library objects (images, videos, models, etc.) into a shared\ncollection. By default only active projects are returned; set filter.include_archived\nto also include archived projects. Deleted projects are never returned."
        },
        {
          "name": "list_workspace_members",
          "description": "List the members of a workspace with their email, role, and status.\n\nUse this to discover who belongs to a workspace and to find the email addresses\nthat the suspend_member, reactivate_member, add_project_members, and\nremove_project_member tools take. Both active and suspended members are returned."
        },
        {
          "name": "list_workspaces",
          "description": "List every workspace the current user belongs to.\n\nReturns workspace id, slug, display name, and last activity timestamp for each\nworkspace, ordered by most recently active first. Does NOT include Creative Units\nbalance — call `get_workspace` with a workspace_id to get the balance for one\nworkspace (do not call it for every workspace just to compare balances).\n\nIMPORTANT: Call tool `get_instructions` first for general platform guidance."
        },
        {
          "name": "reactivate_member",
          "description": "Reactivate a suspended workspace member, restoring their access.\n\nThe membership is set back to ACTIVE with its previous role. This is the inverse\nof suspend_member. Fails if the workspace has invites disabled or the email is not\na current member. Requires workspace member-edit permission."
        },
        {
          "name": "remove_group_member",
          "description": "Remove a member from a group by email.\n\nFails for identity-provider-managed groups. Requires workspace billing-admin permission."
        },
        {
          "name": "remove_group_usage_limit",
          "description": "Remove a group's Creative-Units cap.\n\nRequires workspace billing-admin permission."
        },
        {
          "name": "remove_project_member",
          "description": "Remove a member from a project by email.\n\nRemoving another member requires workspace project-edit permission plus being a\nproject member (workspace admins are exempt); a user can always remove themselves.\nDoes not remove them from the workspace — use suspend_member for that."
        },
        {
          "name": "set_group_usage_limit",
          "description": "Set a group's Creative-Units cap for a period.\n\nRequires workspace billing-admin permission."
        },
        {
          "name": "suspend_member",
          "description": "Suspend a workspace member, revoking their access without deleting them.\n\nThe membership is set to SUSPENDED (reversible with reactivate_member); the\nmember's role is preserved. Fails if the workspace has suspends disabled or the\nemail is not a current member. Requires workspace member-edit permission."
        },
        {
          "name": "update_group_role",
          "description": "Set or clear the workspace role a group grants its members.\n\nTakes effect immediately for all members. Requires workspace billing-admin permission."
        },
        {
          "name": "update_project",
          "description": "Update a project's name, description, instructions, or archive status.\n\nContent fields (name/description/instructions) can only be changed while the project\nis active — unarchive it first. To delete a project use delete_project. Requires\nworkspace project-edit permission."
        }
      ],
      "resources": []
    }
  ],
  "mcpServers": {
    "layer": {
      "type": "http",
      "url": "https://mcp.app.layer.ai/mcp"
    },
    "layer-management": {
      "type": "http",
      "url": "https://mcp.app.layer.ai/mcp-management"
    }
  },
  "developer_resources": [
    {
      "name": "Layer developer documentation",
      "url": "https://www.layer.ai/docs",
      "type": "text/html"
    },
    {
      "name": "Layer API quickstart",
      "url": "https://www.layer.ai/docs/quickstart",
      "type": "text/html"
    },
    {
      "name": "Layer API authentication",
      "url": "https://www.layer.ai/docs/authentication",
      "type": "text/html"
    },
    {
      "name": "Layer REST API reference",
      "url": "https://www.layer.ai/docs/v2/rest-api",
      "type": "text/html"
    },
    {
      "name": "Layer OpenAPI description",
      "url": "https://www.layer.ai/openapi.json",
      "type": "application/json"
    },
    {
      "name": "Layer API index",
      "url": "https://www.layer.ai/api/index.json",
      "type": "application/json"
    },
    {
      "name": "Layer agent onboarding",
      "url": "https://www.layer.ai/api/onboarding.json",
      "type": "application/json"
    },
    {
      "name": "Layer self-serve access guide",
      "url": "https://www.layer.ai/docs/self-serve-access",
      "type": "text/html"
    },
    {
      "name": "Layer API catalog",
      "url": "https://www.layer.ai/.well-known/api-catalog",
      "type": "application/linkset+json"
    },
    {
      "name": "Layer AI catalog",
      "url": "https://www.layer.ai/.well-known/ai-catalog.json",
      "type": "application/json"
    },
    {
      "name": "Layer MCP server",
      "url": "https://www.layer.ai/mcp",
      "type": "text/html"
    },
    {
      "name": "Layer MCP manifest",
      "url": "https://www.layer.ai/.well-known/mcp",
      "type": "application/json"
    },
    {
      "name": "Layer MCP setup guide",
      "url": "https://www.layer.ai/docs/mcp/setup",
      "type": "text/html"
    },
    {
      "name": "Layer API rate limits",
      "url": "https://www.layer.ai/docs/rate-limits",
      "type": "text/html"
    },
    {
      "name": "Layer API versioning",
      "url": "https://www.layer.ai/docs/versioning",
      "type": "text/html"
    },
    {
      "name": "Layer API deprecation policy",
      "url": "https://www.layer.ai/docs/deprecation",
      "type": "text/html"
    },
    {
      "name": "Layer API errors",
      "url": "https://www.layer.ai/docs/errors",
      "type": "text/html"
    },
    {
      "name": "Layer OAuth authorization server metadata",
      "url": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
      "type": "application/json"
    }
  ]
}
