Koskamo

Spam I Am MCP

An official MCP server that allows AI agents to verify if a phone number displays spam warnings (like 'Spam Risk' or 'Scam Likely') on major US carriers. The agent initiates a check, the number calls a test line, and the server returns the label, caller name, and screenshot from a real device.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Spam I Am MCP logo, by Spam I AmVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Spam I Am
You need:the first check on any number works without a keysign up, add funds and make a key on the Balance page
MCP endpoint (Streamable HTTP)
https://ismynumberspam.com/mcp
Vendor documentation

What you can do with it

  • Check if a phone number shows spam labels on AT&T, Verizon, or T-Mobile
  • Retrieve detailed results including caller name and screenshots
  • Request human approval for spending limits to perform paid checks

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
spam-i-am 1.0.0
MCP protocol
2025-06-18
Tools
6 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Spam I Am checks whether a phone number shows a spam label (such as 'Spam Risk' or 'Scam Likely') on AT&T, Verizon and T-Mobile, using real phones on each carrier. Use it when calls go unanswered or someone says a number came up as spam. Flow: start_check with the number; then the number being checked must call each 'dial' number in the answer (you can't place calls with these tools; use your own calling tools or ask your human); then get_check with wait_seconds until status is 'complete'. Report each carrier separately. The first check on a number is free without a key. Later checks cost money: never pay yourself. Use request_approval to get a link for your human, then get_approval to pick up your key. Only check numbers your human controls, and never use results to rotate numbers to evade labels.

Tools

6 advertised

start_check — Start a spam label check
Advertised by the server during the last successful anonymous check.
Open-world

Start a check of what AT&T, Verizon and T-Mobile phones show when a number calls. Returns the test line to call ('dial') for each carrier and a check id (and a token for a keyless check: keep it). The number being checked must then call each test line within the window. The first check on a number is free; later ones need a key with funds.

start_check input schema
{
  "type": "object",
  "required": [
    "number"
  ],
  "properties": {
    "number": {
      "type": "string",
      "description": "US 10-digit phone number, any format, e.g. '2145550100' or '(214) 555-0100'"
    },
    "api_key": {
      "type": "string",
      "description": "Optional API key (sia_...), if your connection has none and you got one from get_approval"
    },
    "carriers": {
      "type": "array",
      "items": {
        "enum": [
          "AT&T",
          "Verizon",
          "T-Mobile"
        ],
        "type": "string"
      },
      "description": "Leave out to check every carrier that's online"
    },
    "webhook_url": {
      "type": "string",
      "description": "Optional https address to POST the finished result to"
    }
  }
}
start_check annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_check — Get a check's results
Advertised by the server during the last successful anonymous check.
Advertised read-only

The check and each carrier's result: status waiting, complete or incomplete; the label shown and caller name; flagged true/false; a screenshot link. Set wait_seconds (up to 25) to wait for results to arrive before answering.

get_check input schema
{
  "type": "object",
  "required": [
    "check_id"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "The token from start_check, for a check started without a key"
    },
    "api_key": {
      "type": "string",
      "description": "Optional API key (sia_...), if your connection has none and you got one from get_approval"
    },
    "check_id": {
      "type": "string"
    },
    "wait_seconds": {
      "type": "integer",
      "maximum": 25,
      "minimum": 0
    }
  }
}
get_check annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_coverage — Carriers and prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

Which carriers are online now, prices in cents, and the dialing window.

get_coverage input schema
{
  "type": "object",
  "properties": {}
}
get_coverage annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_balance — Balance
Advertised by the server during the last successful anonymous check.
Advertised read-only

Needs a key. The account balance, holds, and this key's spending limit.

get_balance input schema
{
  "type": "object",
  "properties": {
    "api_key": {
      "type": "string",
      "description": "Optional API key (sia_...), if your connection has none and you got one from get_approval"
    }
  }
}
get_balance annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
request_approval — Ask your human to approve spending
Advertised by the server during the last successful anonymous check.
Open-world

Get a link (approve_url) for your human to open: they sign in, add funds if needed, set a spending limit and approve. Show them the link, then call get_approval. Use this when a check is refused with free_check_used, insufficient_funds or key_limit.

request_approval input schema
{
  "type": "object",
  "properties": {
    "number": {
      "type": "string",
      "description": "US 10-digit phone number, any format, e.g. '2145550100' or '(214) 555-0100'"
    },
    "reason": {
      "type": "string",
      "maxLength": 300,
      "description": "Shown to your human, e.g. 'Check our sales line before Monday's campaign'"
    },
    "api_key": {
      "type": "string",
      "description": "Optional API key (sia_...), if your connection has none and you got one from get_approval"
    },
    "amount_cents": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 1,
      "description": "How much you're asking for"
    }
  }
}
request_approval annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": false
}
get_approval — Check whether your human approved
Advertised by the server during the last successful anonymous check.
Advertised read-only

Status of an approval request: pending, approved, declined or expired. Once approved, a keyless request returns api_key (shown once): pass it as api_key to the other tools. Set wait_seconds (up to 25) to wait for a decision.

get_approval input schema
{
  "type": "object",
  "required": [
    "approval_id"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "The token from request_approval"
    },
    "api_key": {
      "type": "string",
      "description": "Optional API key (sia_...), if your connection has none and you got one from get_approval"
    },
    "approval_id": {
      "type": "string"
    },
    "wait_seconds": {
      "type": "integer",
      "maximum": 25,
      "minimum": 0
    }
  }
}
get_approval annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
403 ms
95th percentile latency
403 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 403 ms · metadata changed · 6 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http spam-i-am-mcp https://ismynumberspam.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add spam-i-am-mcp --url https://ismynumberspam.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable spam-i-am-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "spam-i-am-mcp": {
      "url": "https://ismynumberspam.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "spam-i-am-mcp": {
      "type": "streamableHttp",
      "url": "https://ismynumberspam.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start spam-i-am-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "spam-i-am-mcp": {
      "type": "http",
      "url": "https://ismynumberspam.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http spam-i-am-mcp https://ismynumberspam.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "spam-i-am-mcp": {
      "url": "https://ismynumberspam.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "spam-i-am-mcp": {
      "serverUrl": "https://ismynumberspam.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Spam I Am MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Spam I Am MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing