MCP Integration Guide
MCP Integration Guide
Every app you create on Web-Nothing is automatically accessible to AI agents via the Model Context Protocol (MCP). Any MCP-compatible agent -- Claude, ChatGPT, or custom agents -- can connect and start working with your app's data in minutes.
For a quick 5-minute setup, see the MCP Quick Start.
Note: Per-App MCP requires your app to be in Live mode. Click Go Live in your workspace toolbar. Apps in Dev mode get a 30-day MCP trial; apps in Live mode get permanent MCP access.
Two MCP Levels
Web-Nothing exposes MCP at two endpoints:
| Level | Endpoint | What It Does |
|---|---|---|
| Per-App | GET/POST /api/apps/{appId}/mcp | Read, create, update, and delete data in one app; modify the app's structure if schema-edit permission is granted |
| Platform | GET/POST /api/mcp | Create, list, modify, and delete apps; install templates; manage workflows and connectors |
Token to endpoint compatibility:
- An App Token works only on the per-app endpoint for the single app it was minted for.
- A Platform Token works on both endpoints — platform-level operations, and the per-app endpoint of any app you own. A single Platform Token is enough for an agent that needs to build an app and then read/write its data.
When to use which:
- Use Per-App MCP for focused agents that only need to operate on one app's data.
- Use Platform MCP for orchestration agents that create apps, install templates, build workflows, or need to work across multiple apps.
Token Management
Agent tokens follow a create-once, copy-once lifecycle. The raw token is shown exactly once at creation and is never retrievable again.
Create a Token
- Open your app in the workspace.
- Click Agent ON to enable agent access.
- Click MCP in the toolbar.
- Choose one of:
- + App Token (blue) — scope is bound to this single app. Default allowedActions:
['*'](all data actions). - + Platform Token (purple) — scope covers all your apps, templates, workflows, and connectors. Default allowedActions:
['*'].
- + App Token (blue) — scope is bound to this single app. Default allowedActions:
- Optional: tick Allow schema edits (advanced) before clicking if you want the agent to be able to add or remove tables, fields, actions, or UI components in this app. Off by default.
Or via API:
POST /api/apps/{appId}/agent-tokens
Content-Type: application/json
{
"name": "My Agent",
"scope": "APP",
"allowedActions": ["*"],
"expiresInDays": 30
}To create a token with schema-edit permission, request the advanced permission string:
{
"name": "Schema Admin",
"scope": "APP",
"allowedActions": ["*", "spec:*"],
"expiresInDays": 30
}This matches the Allow schema edits option in the UI.
Response (201):
{
"id": "clxyz123...",
"token": "wn_a1b2c3d4e5f6...64hex",
"name": "My Agent",
"scope": "APP",
"expiresAt": "2026-04-16T12:00:00.000Z"
}Copy the
tokenvalue immediately. It will never be shown again.
Token Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
name | string | "Agent Token" | Human-readable label (max 100 chars) |
scope | "APP" or "PLATFORM" | "APP" | APP token works on /api/apps/{id}/mcp only; PLATFORM token works on /api/mcp only. The two endpoints are separate today — a PLATFORM token cannot be used on the per-app data endpoint, and an APP token cannot create new apps. |
allowedActions | string[] | ["*"] | Which actions the token can call. * covers all standard data actions. Schema-edit permission and apiCall actions require explicit opt-in (see below). |
expiresInDays | number | 30 | Token lifetime (1-365 days) |
Action scoping rules:
"*"— covers all standard data actions (createRecord,updateRecord,deleteRecord,listRecords,getRecord,cloneRecord,multiRecord).multiRecordcreates one parent + N children atomically in a single transaction (cart submits, invoices with line items, batch RSVP); partial failure rolls back the whole batch."*"does not coverapiCallactions (these forward to external APIs). To allow one, add its action ID toallowedActions, e.g.["*", "send_email"]."*"does not cover schema-edit permission. Add"spec:*"if you want the agent to be able to modify the app's structure — this is the same capability as the Allow schema edits checkbox in the UI.
You can create multiple tokens per app (up to 10), each with different permissions.
Use the Token
Include it as a Bearer token in all MCP requests:
Authorization: Bearer wn_a1b2c3d4e5f6...64hexRevoke a Token
DELETE /api/apps/{appId}/agent-tokens
Content-Type: application/json
{ "tokenId": "clxyz123..." }List Tokens
GET /api/apps/{appId}/agent-tokensReturns all tokens for the app (without the raw token value) including lastUsedAt timestamps.
Per-App MCP Tools
Every app with agent access enabled automatically generates MCP tools based on its data tables and actions. No manual configuration needed.
Tool Naming
Tools are named {app_name}_{action}, where the app name is lowercased with special characters replaced by underscores.
Example: An app named "Task Tracker" with actions add_task, list_tasks, delete_task generates:
task_tracker_add_tasktask_tracker_list_taskstask_tracker_delete_task
Discovery (GET)
curl -s https://web-nothing.vercel.app/api/apps/{appId}/mcp \
-H "Authorization: Bearer wn_your_token" | jq '.result.tools[].name'Returns the full tool listing with names, descriptions, and input schemas.
Execution (POST)
{
"method": "tools/call",
"params": {
"name": "task_tracker_add_task",
"arguments": {
"title": "Buy groceries",
"priority": "high",
"done": false
}
}
}Response:
{
"jsonrpc": "2.0",
"result": {
"content": [{
"type": "text",
"text": "{\"id\":\"rec_abc123\",\"title\":\"Buy groceries\",\"priority\":\"high\",\"done\":false,\"created_at\":\"2026-03-17T10:00:00.000Z\"}"
}]
}
}The text field contains a JSON string. Parse it to get the actual data.
Supported Methods
| Method | Description |
|---|---|
tools/list | Returns the tool array (same as authenticated GET) |
tools/call | Executes a tool with the provided arguments |
Schema-Edit Permission (advanced, opt-in)
When a token is granted schema-edit permission (via the Allow schema edits checkbox in the UI, or "spec:*" in allowedActions), the tools/list response includes additional tools that let the agent:
- Add or remove data tables
- Add, rename, or remove fields inside a table
- Add or remove UI components
- Add or update app actions
- Read the app's current structure
Tokens without schema-edit permission do not see these tools at all. The tools only affect the app the token is scoped to — they cannot touch other users' apps or the Web-Nothing platform itself.
Schema edits are a powerful capability — grant this permission only to agents you trust to change your app's structure. For day-to-day data operations, the default (data-only) permission is safer.
Platform MCP Tools
The platform endpoint exposes tools for managing your entire workspace programmatically.
Endpoint
GET /api/mcp — Tool discovery (requires PLATFORM-scoped token)
POST /api/mcp — Tool executionApp Management
| Tool | Description | Uses Web-Nothing AI? | Input |
|---|---|---|---|
apps_list | List all your active apps | No | (none) |
apps_create_from_spec | Recommended. Create an app from a structure you build yourself. | No | { "spec": { /* full app structure */ } } |
apps_create | Create an app from a natural language prompt. Consumes your prompt quota. | Yes | { "prompt": "Build me a CRM..." } |
apps_modify | Modify an existing app with a prompt. Consumes your prompt quota. Pass dryRun: true to preview the proposed spec + a shallow diff (schemas, actions, layout — added/removed/modified) without writing — no revision is created, but the AI prompt is still consumed. | Yes | { "appId": "...", "prompt": "Add a notes field", "dryRun": true } |
apps_delete | Archive an app (soft delete) | No | { "appId": "..." } |
apps_get_tools | Get the tool definitions for a specific app | No | { "appId": "..." } |
apps_set_public_config | Configure public-facing access for an app — flip publicEnabled, whitelist anonymous-callable actions (publicAllowedActions), set visible schemas, hidden fields, row-scope filters, access code. Without this, POST /api/public/{appId}/action returns 403 "Action not available" because the whitelist is part of the app's public-access settings, not part of the action definition. When enabling publicEnabled for the first time, every schema in publicVisibleSchemas must have row-scope coverage (customerScoped: true, OR a publicFilterConfig entry, OR explicit unsafePublicReadSchemas opt-in). When adding an action to publicAllowedActions, the platform also rejects the call if the action's dataMapping contains a $lookup against a customerScoped:true schema (unless that schema is in unsafePublicReadSchemas) or against a field listed in publicHiddenFields — these would bypass row-scope or response-redaction protections. | No | { "appId": "...", "publicEnabled": true, "publicAllowedActions": ["create_orders"], "publicVisibleSchemas": ["orders"] } |
apps_set_lifecycle | Toggle an app's lifecycle and agent-access flags — go Live / go Dev (isLive), enable or disable per-app MCP access (agentEnabled), set the per-token agent action whitelist (agentAllowedActions) and rate limit (agentRateLimit). Same allowlist + same gates as the equivalent PUT /api/apps/{appId} REST endpoint with a Bearer token: Live cap quota fires on isLive false→true, row-scope coverage is enforced on every schema in publicVisibleSchemas before going Live. Pass only the fields you want to update; omitted fields stay unchanged. For spec edits use apps_modify; for public-* fields use apps_set_public_config. agentRateLimit is silently clamped to [1, 600] (non-numeric / 0 / null falls back to 60). | No | { "appId": "...", "isLive": true, "agentEnabled": true, "agentAllowedActions": ["*"], "agentRateLimit": 60 } |
Template Management
| Tool | Description | Input |
|---|---|---|
templates_list | Browse community templates | { "category": "productivity" } (optional) |
templates_install | Install a template as a new app. Call templates_list first to get a valid templateId — IDs are system-generated opaque strings (e.g. cmn3nu2jv0006iycpcha0ht4), not friendly names. | { "templateId": "cmn3nu2jv0006iycpcha0ht4" } |
Workflow Management
| Tool | Description | Input |
|---|---|---|
workflows_create_from_spec | Recommended. Create a workflow from a fully-specified object you build yourself — no Web-Nothing AI inference, no prompt quota consumed. | { "spec": { "name": "...", "sourceAppId": "...", "sourceSchema": "tasks", "trigger": "record_created", "action": "create_record", "targetAppId": "...", "targetSchema": "events", "fieldMapping": { "title": "{{source.title}}" } } } |
workflows_create | Create a workflow from natural language. Uses Web-Nothing AI; consumes prompt quota. Prefer workflows_create_from_spec when you can build the structure yourself. | { "prompt": "When a task is created, add it to my calendar" } |
workflows_list | List all workflows with execution stats | (none) |
workflows_toggle | Enable or disable a workflow | { "workflowId": "..." } |
Connector Management
| Tool | Description | Input |
|---|---|---|
connectors_list | List your API connectors (credentials never exposed) | (none) |
connectors_create | Create a new connector with encrypted credentials | { "name": "...", "baseUrl": "...", "authType": "BEARER", "credentials": {...} } |
connectors_delete | Delete an API connector | { "connectorId": "..." } |
AI-Readable Documentation
Every agent-enabled app auto-generates documentation that AI agents can consume.
Plain Text (llms.txt)
GET /api/apps/{appId}/llmsReturns a plain-text Markdown document containing:
- App name and description
- MCP endpoint URL and authentication instructions
- Complete tool listing with parameters, types, and required flags
- Data table definitions with field types
- Ready-to-use example requests
This endpoint requires no authentication and is designed to be publicly discoverable so agents can learn about the app before obtaining a token.
Interactive HTML Docs
GET /api/apps/{appId}/docsReturns a styled HTML documentation page with the same information, useful for human developers integrating with the MCP endpoint.
Connecting MCP Clients
Claude Desktop / Claude Code
Per-App connection:
{
"mcpServers": {
"my-task-tracker": {
"url": "https://web-nothing.vercel.app/api/apps/{appId}/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer wn_your_token_here"
}
}
}
}Platform connection:
{
"mcpServers": {
"web-nothing-platform": {
"url": "https://web-nothing.vercel.app/api/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer wn_your_platform_token_here"
}
}
}
}For Claude Code, you can also use the CLI:
claude mcp add web-nothing \
--transport http \
https://web-nothing.vercel.app/api/apps/{appId}/mcp \
-- --header "Authorization: Bearer wn_your_token_here"ChatGPT (Custom GPT with Actions)
- In ChatGPT, create or edit a Custom GPT.
- Under Actions, add a new action pointing to the MCP endpoint:
{
"openapi": "3.1.0",
"info": { "title": "Web-Nothing MCP", "version": "1.0.0" },
"servers": [{ "url": "https://web-nothing.vercel.app" }],
"paths": {
"/api/apps/{appId}/mcp": {
"post": {
"operationId": "callMCPTool",
"summary": "Execute an MCP tool call",
"parameters": [
{ "name": "appId", "in": "path", "required": true, "schema": { "type": "string" } }
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"method": { "type": "string", "enum": ["tools/call", "tools/list"] },
"params": {
"type": "object",
"properties": {
"name": { "type": "string" },
"arguments": { "type": "object" }
}
}
}
}
}
}
}
}
}
}
}- Set Authentication to "API Key" with header
Authorizationand valueBearer wn_your_token_here.
Any HTTP Client
Any agent or automation tool that can make HTTP requests can use the MCP endpoints directly:
# Discover tools
curl -s https://web-nothing.vercel.app/api/apps/{appId}/mcp \
-H "Authorization: Bearer wn_your_token" | jq .
# Execute a tool
curl -s -X POST https://web-nothing.vercel.app/api/apps/{appId}/mcp \
-H "Authorization: Bearer wn_your_token" \
-H "Content-Type: application/json" \
-d '{
"method": "tools/call",
"params": {
"name": "task_tracker_list_tasks",
"arguments": { "limit": 5 }
}
}' | jq '.result.content[0].text | fromjson'Security
Token Scopes
| Scope | Access Level | Use Case |
|---|---|---|
APP | Single app's data operations | Per-app agents (CRM bot, task bot) |
PLATFORM | All apps, templates, workflows, connectors | Orchestration agents, workspace managers |
Security Features
- Encrypted storage -- tokens are stored as SHA-256 hashes; raw values are never persisted
- Scoped access -- APP tokens cannot access other apps; PLATFORM tokens are limited to the user's own workspace
- Audit logging -- every tool call is recorded with the token used, action executed, parameters, result, and duration
- Expiration -- tokens expire after 1-365 days (default 30)
- Credential protection -- API connector credentials and sensitive operations require explicit token permissions (not covered by wildcards)
- Rate limiting -- per-app and per-token rate limits prevent abuse
Agent Build Strategies
Web-Nothing offers three ways to create an app via MCP. They differ in how much Web-Nothing AI inference they use — which directly affects your monthly prompt quota.
Strategy A: Install a template (cheapest)
Best when an existing template covers what you need. No Web-Nothing AI is called.
- List community templates with
templates_listto find a match. - Install with
templates_install— the app is created with seed data. - Customize on the per-app endpoint: add or rename fields with the schema-edit tools (requires the Allow schema edits permission), then create or update records as usual.
Strategy B: Build the structure yourself (recommended for autonomous agents)
Best when you want to control the exact shape of the app. No Web-Nothing AI is called — your agent does the reasoning on its own side, and Web-Nothing just validates the structure and stores it.
- Construct the app structure (tables, fields, actions, layout) in your agent.
- Submit it to
apps_create_from_spec— if the structure is valid, the app is created on the spot. If not, you get a detailed list of issues to fix and retry. - Iterate with the schema-edit tools on the per-app endpoint, or just populate data with the standard CRUD tools.
Three ways to learn the structure shape:
- Component reference: see the Component Catalog for the exact
typestrings and props your spec can include — name mismatches cause silent drops at render time. - Inspect a template: install one with
templates_install, then callapps_get_toolsto see what tools (and therefore what fields and actions) it exposes. - Read an existing app: call the schema-edit tools on any app you already have and use the "read current structure" tool to see a working example.
Strategy C: One-shot from a prompt (uses Web-Nothing AI)
Best for the first-time bootstrap when you don't have a template or structure in mind. Consumes one prompt from your monthly quota.
apps_create({ prompt: "Build me a CRM with deals, contacts, and tasks" })After the bootstrap, switch to Strategy B to iterate — keep your prompt quota for cases where you actually need natural-language generation.
Summary — which tools use Web-Nothing AI:
| Path | Web-Nothing AI? |
|---|---|
| Data CRUD (records) | No |
| Schema-edit tools | No |
templates_install | No |
apps_create_from_spec | No |
apps_create | Yes |
apps_modify | Yes |
workflows_create_from_spec | No |
workflows_create | Yes |
Limits & Quotas
Web-Nothing enforces fair-use limits across all tiers, including paid plans. These caps protect platform stability while leaving plenty of room for normal usage — existing apps average well under every cap.
Per-app structural limits (all tiers)
| Limit | Cap | Why |
|---|---|---|
| Data tables per app | 20 | Most apps use 3-8 tables |
| Actions per app | 100 | Most apps use 10-30 actions |
| App structure size | 500 KB | Typical apps are under 10 KB |
| Version history retained | Last 100 revisions | Older revisions are pruned automatically on new writes |
Records per data table (tiered)
| Tier | Records per table |
|---|---|
| Free | 1,000 |
| Lite | 5,000 |
| Starter | 25,000 |
| Business | 100,000 |
| Agency | 500,000 |
Attempts to grow a table beyond its cap return 413 with a clear message. Updates and deletes are still allowed even if an existing table exceeds the cap (e.g. after a downgrade), so you never lose access to your own data.
Rate limits (per agent token)
| Action | Window | Limit |
|---|---|---|
| Any MCP call (per token) | 1 min | 60 (configurable 1-600 per app) |
| All MCP calls (per user, all apps) | 1 day | tier-aware: Free 1,000 / Lite 5,000 / Starter 25,000 / Business 100,000 / Agency 500,000 |
| Data writes (per user) | 1 min | 30 |
| Data reads (per user) | 1 min | 60 |
Per-minute and per-token limits are flat across tiers — they're burst protection, not feature gates. The daily cap scales with your subscription tier.
Exceeding a rate limit returns 429 with Retry-After.
Related
| Topic | Document |
|---|---|
| Component vocabulary | Component Catalog |
| 5-minute quick start | MCP Quick Start |
| Modifying apps via chat | Agent Chat Guide |
| Cross-app automation | Workflows |
| External API connections | API Connectors |
| Receiving external data | Webhooks |
| Full user guide | User Guide |