Surgemesh

Agent-first social publishing: connect channels, quote, and schedule posts across networks.

Should I use this

Quality & Safety

B
Description quality
88%
Schema completeness
66%
Naming quality
97%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (10)

  • MEDIUMTool 'get_topup_link' description contains placeholder textin get_topup_link
  • MEDIUMTool 'create_checkout_link' description contains placeholder textin create_checkout_link
  • MEDIUMTool 'get_referral_code' description contains placeholder textin get_referral_code
  • MEDIUMTool 'list_networks' description contains placeholder textin list_networks
  • MEDIUMTool 'connect_channel' description contains placeholder textin connect_channel
  • LOWTool 'get_pricing' description lacks action verbin get_pricing
  • LOWTool 'list_posts' description lacks action verbin list_posts
  • LOWTool 'get_verification' description lacks action verbin get_verification
  • LOWTool 'get_connect_status' description lacks action verbin get_connect_status
  • LOWTool 'disconnect_channel' description lacks action verbin disconnect_channel

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,156Tokens (tool definitions)
~544 BTypical response size
Moderate attention impact (1.68% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "surgemesh": {
      "url": "https://api.surgemesh.com/mcp"
    }
  }
}

Remote endpoints

https://api.surgemesh.com/mcpstreamable-http

What it can do

Tool inventory

Tools (24)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_pricing

Surgemesh prices: base per delivery, a hard ceiling (never more than $0.06 per delivery), time-of-day pricing (quieter times cost less, busier times cost more), credit packs. No auth needed.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟡get_quote(scheduled_at, deliveries)

Exact price quote (locks at post acceptance; guard with max_price_usd) for N deliveries at scheduled_at, with cheaper_times (nearby times and their exact prices) when a nearby time costs less.

Input Schema

{
  "type": "object",
  "properties": {
    "scheduled_at": {
      "type": "string",
      "format": "date-time"
    },
    "deliveries": {
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    }
  },
  "required": [
    "scheduled_at"
  ],
  "additionalProperties": false
}
🟡list_channels

Channels (connected social accounts) this key can post to.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟢list_brands

Brands in this account.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟡create_post(idempotency_key, brand_id, body, media_urls, scheduled_at, ...)

Schedule a post to one or more channels. idempotency_key is required; retries with the same key never double-post or double-charge. Optional max_price_usd refuses a price above your cap. Preview: posts are validated and priced in the sandbox, not published yet.

Input Schema

{
  "type": "object",
  "properties": {
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128
    },
    "brand_id": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "maxLength": 5000
    },
    "media_urls": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      },
      "maxItems": 10
    },
    "scheduled_at": {
      "type": "string",
      "format": "date-time"
    },
    "channels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 20
    },
    "max_price_usd": {
      "type": "number"
    }
  },
  "required": [
    "idempotency_key",
    "brand_id",
    "body",
    "scheduled_at",
    "channels"
  ],
  "additionalProperties": false
}
🟢list_posts(brand_id)

Recent posts for a brand with per-channel delivery state.

Input Schema

{
  "type": "object",
  "properties": {
    "brand_id": {
      "type": "string"
    }
  },
  "required": [
    "brand_id"
  ],
  "additionalProperties": false
}
🔴cancel_post(id)

Cancel a queued post. Undelivered deliveries are refunded to credit.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟡get_topup_link(pack, rail)

Coming soon (payments are not enabled yet). Payment link to buy a credit pack (pack_5 $5, pack_20 $20, pack_100 $100; each pack buys exactly its price in credit). Rails: mpp_card (card via Stripe Shared Payment Token), mpp_stablecoin (USDC.e on Tempo, USDC on Solana), x402 (USDC on Base); each shows live or coming_soon. POST to paymentLink with your Bearer key, pay the 402 challenge, retry. No payment happens in this tool.

Input Schema

{
  "type": "object",
  "properties": {
    "pack": {
      "type": "string",
      "enum": [
        "pack_5",
        "pack_20",
        "pack_100"
      ]
    },
    "rail": {
      "type": "string",
      "enum": [
        "mpp_card",
        "mpp_stablecoin",
        "x402"
      ]
    }
  },
  "required": [
    "pack"
  ],
  "additionalProperties": false
}
🟡create_checkout_link(pack, idempotency_key)

Card checkout for a human (coming soon): returns a Stripe-hosted checkout_url for a credit pack (pack_5 $5, pack_20 $20, pack_100 $100; each pack buys exactly its price in credit). Give the link to the person paying; credits arrive only after Stripe confirms. Verified owners, admin key. 503 checkout_not_enabled until switched on.

Input Schema

{
  "type": "object",
  "properties": {
    "pack": {
      "type": "string",
      "enum": [
        "pack_5",
        "pack_20",
        "pack_100"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Optional. Reuse on retries so the action happens once."
    }
  },
  "required": [
    "pack"
  ],
  "additionalProperties": false
}
🟢get_referral_code

Your referral code, share link and stats (referred signups, qualified, credits earned and pending). Referral rewards are Surgemesh credits only, never cash, and are coming soon; codes can be shared now. Verified owners only.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟢get_usage

Account plan, credits and recent ledger.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟢get_onboarding

Onboarding status: verification state, remaining steps and the exact next call. Start here after signup.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
⚪start_email_verification(idempotency_key)

Email a 6-digit code to the account email (expires in 10 minutes, 5 attempts). Then call confirm_email_verification with the code.

Input Schema

{
  "type": "object",
  "properties": {
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Optional. Reuse on retries so the action happens once."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟡confirm_email_verification(verification_id, code)

Submit the 6-digit code from the verification email.

Input Schema

{
  "type": "object",
  "properties": {
    "verification_id": {
      "type": "string"
    },
    "code": {
      "type": "string",
      "pattern": "^[0-9 -]{6,9}$"
    }
  },
  "required": [
    "verification_id",
    "code"
  ],
  "additionalProperties": false
}
🟡start_dns_verification(domain, idempotency_key)

Get a TXT record to publish on the account email domain (or a parent domain). Then call check_dns_verification.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string"
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Optional. Reuse on retries so the action happens once."
    }
  },
  "required": [
    "domain"
  ],
  "additionalProperties": false
}
🟢check_dns_verification(verification_id)

Check whether the TXT record is visible; verifies the account when it is.

Input Schema

{
  "type": "object",
  "properties": {
    "verification_id": {
      "type": "string"
    }
  },
  "required": [
    "verification_id"
  ],
  "additionalProperties": false
}
🟢request_owner_approval(note, callback_url, idempotency_key)

Email the account owner a one-tap Approve link (24 h, single use). Poll get_verification until verified or denied.

Input Schema

{
  "type": "object",
  "properties": {
    "note": {
      "type": "string",
      "maxLength": 200
    },
    "callback_url": {
      "type": "string",
      "format": "uri"
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Optional. Reuse on retries so the action happens once."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢get_verification(verification_id)

Status of one verification (pending, verified, expired, failed, denied).

Input Schema

{
  "type": "object",
  "properties": {
    "verification_id": {
      "type": "string"
    }
  },
  "required": [
    "verification_id"
  ],
  "additionalProperties": false
}
⚪rotate_my_key(grace_seconds, idempotency_key)

Rotate the calling key: returns a new key (shown once) with the same scopes; the old key keeps working for grace_seconds (default 3600, 0 = revoke now).

Input Schema

{
  "type": "object",
  "properties": {
    "grace_seconds": {
      "type": "integer",
      "minimum": 0,
      "maximum": 86400
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Optional. Reuse on retries so the action happens once."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟢list_networks

Every supported network: status (available, connect_pending_review, connect_pending_setup), how to connect it, review limits and media limits (connect_pending_setup = coming soon). No auth needed.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟢connect_channel(brand_id, network, label, options)

Start a one-tap connect for a brand on an OAuth or app-password network (networks marked coming soon in list_networks are refused). Returns connect_url: give it to the account owner to open once. Then poll get_connect_status.

Input Schema

{
  "type": "object",
  "properties": {
    "brand_id": {
      "type": "string"
    },
    "network": {
      "type": "string",
      "enum": [
        "threads",
        "youtube",
        "linkedin",
        "tiktok",
        "pinterest",
        "bluesky"
      ]
    },
    "label": {
      "type": "string",
      "maxLength": 80
    },
    "options": {
      "type": "object",
      "description": "Network options listed by list_networks (e.g. board_id, organization_id)",
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "required": [
    "brand_id",
    "network"
  ],
  "additionalProperties": false
}
🟢get_connect_status(connect_id)

Status of a connect session: pending, connected (with channel_id), failed or expired.

Input Schema

{
  "type": "object",
  "properties": {
    "connect_id": {
      "type": "string"
    }
  },
  "required": [
    "connect_id"
  ],
  "additionalProperties": false
}
⚪disconnect_channel(channel_id)

Disconnect a channel: erases its stored credentials and revokes the provider token where the network supports it.

Input Schema

{
  "type": "object",
  "properties": {
    "channel_id": {
      "type": "string"
    }
  },
  "required": [
    "channel_id"
  ],
  "additionalProperties": false
}
🟢get_analytics(from, to, granularity, brand_id)

Posts, deliveries, published, failed and spend over time (UTC), with a per-brand breakdown.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "format": "date"
    },
    "to": {
      "type": "string",
      "format": "date"
    },
    "granularity": {
      "type": "string",
      "enum": [
        "day",
        "week",
        "month"
      ]
    },
    "brand_id": {
      "type": "string"
    }
  },
  "required": [],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded24 tools