cmendes0101 avatar

Sipflow

cmendes0101/sipflow-cursor-plugin

Connects your AI agent to a curated corpus of SIP and VoIP documentation covering 40+ vendor stacks (Kamailio, FreeSWITCH, Asterisk, Twilio, Cisco), 60+ RFCs, and STIR/SHAKEN specs. Exposes about 20 read-only tools for searching vendor docs, parsing SIP messages and SDP, rendering ladder diagrams, linting traces, reviewing configs, validating E.164 numbers, and checking STIR/SHAKEN identity headers. Every answer cites a source URL from the corpus. Hosted at mcp.sipflow.dev/mcp over streamable HTTP, so no local setup. Reach for this when you're debugging WebRTC negotiation, troubleshooting response codes, reviewing dialplan configs, or need authoritative references instead of LLM recall on telecom protocols.

tools
22
transport
HTTP
last updated
May 14, 2026

Install

From registry metadata
$ npx add-mcp https://mcp.sipflow.dev/mcp --name sipflow

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http sipflow https://mcp.sipflow.dev/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 22 tools

Verified live against the running server on Nov 6, 2026.

search_sip_docs[cost: rag (one embed + one vector search) | read-only, network: outbound to embed model only] Vector search over Sipflow's curated VoIP knowledge base: vendor docs (Asterisk, FreeSWITCH, Kamailio, OpenSIPS, Twilio, Cisco, etc.), SIP/SDP/WebRTC RFCs, STIR/SHAKEN material (RFC...4 params

[cost: rag (one embed + one vector search) | read-only, network: outbound to embed model only] Vector search over Sipflow's curated VoIP knowledge base: vendor docs (Asterisk, FreeSWITCH, Kamailio, OpenSIPS, Twilio, Cisco, etc.), SIP/SDP/WebRTC RFCs, STIR/SHAKEN material (RFC...

Parameters* required
limitinteger
Maximum number of snippets to return (1-15).default: 5
query*string
Natural-language question or keywords. Be specific - include vendor name, header, error code, module, or RFC if known. Multi-sentence queries are fine.
sourceTypevalue
Restrict by document type. Available: rfc | pbx (Asterisk/FreeSWITCH/Kamailio/OpenSIPS) | sbc (SBCs) | cpaas (Twilio/Telnyx/...) | uc-cloud (Teams/Zoom/...) | endpoint (phones/softphones) | stir-sh...
vendorstring
Restrict results to a single vendor/stack (e.g. "asterisk", "kamailio"). Omit to search all vendors.one of asterisk · freeswitch · kamailio · opensips · freepbx · yate
lookup_response_code[cost: free (pure CPU, no network) | read-only] Instant static lookup of a SIP response code (100-699). Returns name, RFC anchor, category, description, common operator-flavored causes, and known vendor-specific reason-phrase variants (e.g. OpenSIPS emits 484 'Invalid FROM' on...1 params

[cost: free (pure CPU, no network) | read-only] Instant static lookup of a SIP response code (100-699). Returns name, RFC anchor, category, description, common operator-flavored causes, and known vendor-specific reason-phrase variants (e.g. OpenSIPS emits 484 'Invalid FROM' on...

Parameters* required
code*integer
SIP response code (e.g. 488 for Not Acceptable Here).
lookup_sip_header[cost: free (pure CPU, no network) | read-only] Instant lookup of a SIP header by canonical or compact form (e.g. "Via" / "v", "Diversion", "P-Asserted-Identity", "Identity", "Session-Expires"). Returns canonical form, compact alias, RFC anchor, where it appears (request / res...1 params

[cost: free (pure CPU, no network) | read-only] Instant lookup of a SIP header by canonical or compact form (e.g. "Via" / "v", "Diversion", "P-Asserted-Identity", "Identity", "Session-Expires"). Returns canonical form, compact alias, RFC anchor, where it appears (request / res...

Parameters* required
name*string
Header name (canonical, e.g. "Via", or compact, e.g. "v"). Case-insensitive.
detect_sip_stack[cost: free (pure CPU, no network) | read-only] Identify the SIP product behind a piece of input. Works on both: - a SIP trace (User-Agent / Server headers from PCAP/sngrep/syslog), and - a vendor config blob (kamailio.cfg, sip.conf, pjsip.conf, FreeSWITCH XML, opensips.cfg) d...3 params

[cost: free (pure CPU, no network) | read-only] Identify the SIP product behind a piece of input. Works on both: - a SIP trace (User-Agent / Server headers from PCAP/sngrep/syslog), and - a vendor config blob (kamailio.cfg, sip.conf, pjsip.conf, FreeSWITCH XML, opensips.cfg) d...

Parameters* required
filenameHintstring
Optional filename (e.g. "kamailio.cfg", "pjsip.conf"). Strongly improves config-mode detection when supplied.
kindstring
What the input is. "trace" looks at SIP headers only, "config" runs vendor-config heuristics, "auto" tries trace first then falls back to config detection.one of auto · trace · configdefault: auto
text*string
Raw SIP trace text OR a vendor config blob.
detect_sip_vendor_from_config[cost: free (pure CPU, no network) | read-only] Heuristic-only sibling of `detect_sip_stack`, scoped to vendor configs. Returns the matched vendor slug, a confidence level, and the structural signals that fired (loadmodule syntax, route blocks, profile elements, etc.). Use thi...2 params

[cost: free (pure CPU, no network) | read-only] Heuristic-only sibling of `detect_sip_stack`, scoped to vendor configs. Returns the matched vendor slug, a confidence level, and the structural signals that fired (loadmodule syntax, route blocks, profile elements, etc.). Use thi...

Parameters* required
filenameHintstring
Optional filename ("kamailio.cfg", "pjsip.conf", "sofia/external.xml") to bias detection.
text*string
Config blob (UTF-8 plaintext).
minimize_sip_trace[cost: free (pure CPU, no network) | read-only, no persistence] Reduce a raw SIP trace to a compact form suitable for sending to an LLM. Preserves SDP bodies and routing/auth/dialog headers; prunes well-known noise (User-Agent, Server, Allow, Accept-*, Date, P-* informational,...2 params

[cost: free (pure CPU, no network) | read-only, no persistence] Reduce a raw SIP trace to a compact form suitable for sending to an LLM. Preserves SDP bodies and routing/auth/dialog headers; prunes well-known noise (User-Agent, Server, Allow, Accept-*, Date, P-* informational,...

Parameters* required
maxBytesinteger
Truncate the minimized output if it exceeds this many bytes (default 200000, matches Sipflow's analyze pipeline).default: 200000
text*string
Raw SIP trace text. Multiple messages may be concatenated.
render_sip_ladder[cost: free (pure CPU, no network) | read-only] Parse a raw SIP trace (PCAP-decoded text, sngrep export, syslog, or pasted INVITE/200 dialog) and emit a Mermaid `sequenceDiagram` block visualizing the call flow. Most chat hosts (Claude, ChatGPT, Cursor, GitHub) render Mermaid...11 params

[cost: free (pure CPU, no network) | read-only] Parse a raw SIP trace (PCAP-decoded text, sngrep export, syslog, or pasted INVITE/200 dialog) and emit a Mermaid `sequenceDiagram` block visualizing the call flow. Most chat hosts (Claude, ChatGPT, Cursor, GitHub) render Mermaid...

Parameters* required
aliasesobject
Friendly lane labels. Match order: exact "ip:port" → bare "ip" → top-Via host (with or without port) → Contact host (with or without port). Most-specific match wins; otherwise the lane is labeled w...
callIdstring
Render only this Call-ID. Required when the trace contains multiple calls; otherwise the only call is used.
compactboolean
Drop OPTIONS keepalives and retransmissions. Hidden counts are summarized in a `Note over` line.default: false
correlationHeadersarray
Header names to use for cross-leg call correlation (value-equality). When provided, calls sharing the same value for any listed header are merged into one ladder. Example: `["X-ACME-Session-ID","X-...
groupByIpboolean
Collapse multiple ports on the same IP into one participant lane (default). Set to `false` to fall back to the legacy one-column-per-`ip:port` layout when you specifically need port-level granulari...default: true
groupRetransmitsboolean
Collapse adjacent identical retransmissions on the same direction into a single arrow + `Note over: xN over Tms`. Independent of `compact` (which drops them entirely).default: true
highlightFailuresboolean
Bold the first non-1xx final response per request leg (CSeq) so the failure jumps out in the ladder.default: true
includeTimingboolean
Append `+Nms` (delta from previous arrow) to each arrow label.default: false
maxMessagesinteger
Hard cap on rendered arrows. Extra messages produce a truncation note. Hard ceiling is 200.default: 60
splitOnNewBranchboolean
Emit a `--- failover to <ip[:port]> ---` separator before any request sent to a previously-unseen destination. Useful when the trace fails over between gateway IPs.default: false
text*string
Raw SIP trace text. Multiple messages may be concatenated.
sip_ladder_example[cost: free (pure CPU, no network) | read-only] Return a hand-curated SIP scenario as a Mermaid `sequenceDiagram` plus a bullet list of step-by-step explanations with RFC references. Use this when the user asks 'show me what X looks like' and you don't have a real trace handy....4 params

[cost: free (pure CPU, no network) | read-only] Return a hand-curated SIP scenario as a Mermaid `sequenceDiagram` plus a bullet list of step-by-step explanations with RFC references. Use this when the user asks 'show me what X looks like' and you don't have a real trace handy....

Parameters* required
actorNamesobject
Override the default actor display names (Alice/Bob/Proxy). Maps to the first/second/third lane in left-to-right order.
includeExplanationboolean
Append a bulleted **Notes** section with RFC references for each step.default: true
scenario*string
Which scenario to render. Valid ids: basic-call, auth-challenge, cancel-before-answer, early-media, hold-resume, refer-blind, proxy-with-record-route, shaken-attested-invite, bye-glare, redirect-302.one of basic-call · auth-challenge · cancel-before-answer · early-media · hold-resume · refer-blind
verboseboolean
Also include the scenario's long Markdown explanation. Useful when the LLM is going to teach the user; off by default to keep responses small.default: false
lint_sip_request[cost: free (pure CPU, no network) | read-only, no persistence] Run RFC 3261 / RFC 3325 / RFC 8224 / RFC 8225 / CTIA BCID compliance checks on a single raw SIP request (typically an INVITE) and return a list of findings. Catches the failure modes that silently break carrier in...1 params

[cost: free (pure CPU, no network) | read-only, no persistence] Run RFC 3261 / RFC 3325 / RFC 8224 / RFC 8225 / CTIA BCID compliance checks on a single raw SIP request (typically an INVITE) and return a list of findings. Catches the failure modes that silently break carrier in...

Parameters* required
text*string
Raw SIP request text. Should start with the request line (e.g. `INVITE sip:...@... SIP/2.0`). Headers must be CRLF or LF separated.
parse_sip_message[cost: free (pure CPU, no network) | read-only, no persistence] Parse a single raw SIP message (request OR response) and return a structured view: start line (method/status), every header in order with line numbers, body, duplicate-header counts, and a list of structural flags...1 params

[cost: free (pure CPU, no network) | read-only, no persistence] Parse a single raw SIP message (request OR response) and return a structured view: start line (method/status), every header in order with line numbers, body, duplicate-header counts, and a list of structural flags...

Parameters* required
text*string
Raw SIP message text. Should start with a request line (`INVITE sip:...@... SIP/2.0`) or status line (`SIP/2.0 200 OK`). Headers must be CRLF or LF separated.
diff_sip_messages[cost: free (pure CPU, no network) | read-only, no persistence] Take two SIP messages (typically the same request observed at two adjacent hops - e.g. the INVITE leaving FreeSWITCH and the INVITE arriving at Kamailio) and surface a structured per-header diff: `added`, `removed...4 params

[cost: free (pure CPU, no network) | read-only, no persistence] Take two SIP messages (typically the same request observed at two adjacent hops - e.g. the INVITE leaving FreeSWITCH and the INVITE arriving at Kamailio) and surface a structured per-header diff: `added`, `removed...

Parameters* required
after*string
SIP message as observed at the *downstream* hop (e.g. what Kamailio believes it received).
before*string
SIP message as observed at the *upstream* hop (e.g. what FreeSWITCH believes it sent).
labelAfterstring
Display label for the downstream side. Default "after".default: after
labelBeforestring
Display label for the upstream side. Default "before".default: before
review_sip_config[cost: free (pure CPU, no network) | read-only] Use this when the user asks 'review my config' or attaches a kamailio.cfg, sip.conf, pjsip.conf, FreeSWITCH XML profile, opensips.cfg, `res_fax.conf` / `udptl.conf` / `spandsp.conf` (fax-relay tuning), or a SIP-shaped source file...3 params

[cost: free (pure CPU, no network) | read-only] Use this when the user asks 'review my config' or attaches a kamailio.cfg, sip.conf, pjsip.conf, FreeSWITCH XML profile, opensips.cfg, `res_fax.conf` / `udptl.conf` / `spandsp.conf` (fax-relay tuning), or a SIP-shaped source file...

Parameters* required
filenameHintstring
Optional filename or path (e.g. "kamailio.cfg", "etc/asterisk/pjsip.conf", "sofia/external.xml"). Strongly improves vendor detection.
text*string
The full config blob (or a representative excerpt). UTF-8 plaintext.
vendorHintstring
Skip auto-detection and force a specific vendor. Use when the heuristics return low confidence or the wrong vendor.one of asterisk · freeswitch · kamailio · opensips · freepbx · yate
webrtc_sip_checklist[cost: free (pure CPU, no network) | read-only] Return a curated checklist of WebRTC ↔ SIP requirements (WSS transport, ICE gathering, DTLS-SRTP fingerprint, rtcp-mux + BUNDLE, media relay / rtpengine, STUN/TURN, secure-context Origin allowlist, Opus codec, session-timer behav...3 params

[cost: free (pure CPU, no network) | read-only] Return a curated checklist of WebRTC ↔ SIP requirements (WSS transport, ICE gathering, DTLS-SRTP fingerprint, rtcp-mux + BUNDLE, media relay / rtpengine, STUN/TURN, secure-context Origin allowlist, Opus codec, session-timer behav...

Parameters* required
configTextstring
Optional config blob. When supplied, items with matching signals are marked as present; vendor is auto-detected if not supplied.
filenameHintstring
Optional filename ("kamailio.cfg", etc.) to bias auto-detection.
vendorstring
Vendor slug. Omit and supply `configText` to auto-detect.one of asterisk · freeswitch · kamailio · opensips · freepbx · yate
parse_sdp[cost: free (pure CPU, no network) | read-only] Parse a Session Description Protocol body and return a structured view: origin, session, timing, per-media codecs (rtpmap + fmtp), direction, DTLS setup + fingerprint, ICE credentials + candidates, rtcp-mux, BUNDLE groups, fax-re...1 params

[cost: free (pure CPU, no network) | read-only] Parse a Session Description Protocol body and return a structured view: origin, session, timing, per-media codecs (rtpmap + fmtp), direction, DTLS setup + fingerprint, ICE credentials + candidates, rtcp-mux, BUNDLE groups, fax-re...

Parameters* required
sdp*string
SDP body - the section after the empty line in an INVITE/200/UPDATE.
compare_sdp_offer_answer[cost: free (pure CPU, no network) | read-only] Diff a SIP/SDP offer and answer and surface the issues that actually break calls in practice: codec intersection per m-line, direction compatibility (sendrecv ↔ recvonly), DTLS setup-role conflicts (active+active / passive+passiv...2 params

[cost: free (pure CPU, no network) | read-only] Diff a SIP/SDP offer and answer and surface the issues that actually break calls in practice: codec intersection per m-line, direction compatibility (sendrecv ↔ recvonly), DTLS setup-role conflicts (active+active / passive+passiv...

Parameters* required
answer*string
SDP answer body.
offer*string
SDP offer body.
validate_stir_shaken_identity[cost: external_io (HTTPS fetch of the x5u cert) | read-only] Verify a SIP `Identity:` JWS (RFC 8224 / SHAKEN). Fetches the x5u certificate, parses it, verifies the ES256 signature against the cert's public key, and optionally validates the RCD icon hash (RFC 9795). The icon-h...8 params

[cost: external_io (HTTPS fetch of the x5u cert) | read-only] Verify a SIP `Identity:` JWS (RFC 8224 / SHAKEN). Fetches the x5u certificate, parses it, verifies the ES256 signature against the cert's public key, and optionally validates the RCD icon hash (RFC 9795). The icon-h...

Parameters* required
expectedIconHashstring
Pre-extracted icon hash, e.g. `sha256-XYZ` (RFC 9795 §6.1 form `<algorithm>-<base64>`). Pass this OR `rcdi`.
headerB64*string
Base64url-encoded JWS protected header (the first dot-separated segment).
iconUrlstring
RCD icon URL - `payload.rcd.icn`. Omit if no Rich Call Data icon.
infoUrlstring
Cert URL from the SIP Identity header `info=` param (or the JWT `x5u`). If omitted, signature verification is skipped.
payloadB64*string
Base64url-encoded JWS payload (the second segment).
rcdiobject
Full `payload.rcdi` claim. The validator looks up `/icn` first (RFC 9795 §6.1 spec form), then falls back to the legacy `icn` key (still seen in the wild). A legacy hit produces a `rcdi-pointer-for...
signatureB64*string
Base64url-encoded ES256 signature (the third segment, raw R||S, 64 bytes).
strictRfc9795boolean
When true, reject the legacy `rcdi['icn']` key as a hard failure rather than warning. Default false.
stir_attestation_explainer[cost: free (pure CPU, no network) | read-only] Static explainer for STIR/SHAKEN: maps attestation levels (A / B / C per RFC 8588) to plain-English requirements + common scenarios, and SIP codes commonly emitted by signing/verification (428 / 436 / 437 / 438 / 608) to their RF...2 params

[cost: free (pure CPU, no network) | read-only] Static explainer for STIR/SHAKEN: maps attestation levels (A / B / C per RFC 8588) to plain-English requirements + common scenarios, and SIP codes commonly emitted by signing/verification (428 / 436 / 437 / 438 / 608) to their RF...

Parameters* required
attestationstring
Attestation level: "A" Full / "B" Partial / "C" Gateway.one of A · B · C
codeinteger
SIP response code commonly seen in STIR/SHAKEN flows (428, 436, 437, 438, 608).
validate_e164_number[cost: free (pure CPU, no network) | read-only] Parse a phone number, normalize to E.164, and classify it. International coverage is via libphonenumber-js (every country, line type when known). NANP numbers (CC=1) are additionally split into NPA (area code) / NXX (central offi...1 params

[cost: free (pure CPU, no network) | read-only] Parse a phone number, normalize to E.164, and classify it. International coverage is via libphonenumber-js (every country, line type when known). NANP numbers (CC=1) are additionally split into NPA (area code) / NXX (central offi...

Parameters* required
number*string
Phone number in any common form. E.164 (+CCNNN…) is preferred; 10-digit US numbers are accepted as a convenience.
troubleshoot_response_code[cost: rag (one embed + one vector search) | read-only, network: outbound to embed model only | rate-limited per IP] Like `lookup_response_code` but augmented: returns the static RFC entry PLUS the top vendor-specific RAG hits for the exact code (and any free-text context the...3 params

[cost: rag (one embed + one vector search) | read-only, network: outbound to embed model only | rate-limited per IP] Like `lookup_response_code` but augmented: returns the static RFC entry PLUS the top vendor-specific RAG hits for the exact code (and any free-text context the...

Parameters* required
code*integer
SIP response code (e.g. 488, 503, 438).
contextstring
Optional free-text context: a snippet of the trace, the Reason header, the Warning header, or a one-line description of what the user was trying to do.
vendorHintstring
Vendor slug to filter the RAG search (e.g. "kamailio", "freeswitch", "twilio"). Strongly recommended.one of asterisk · freeswitch · kamailio · opensips · freepbx · yate
dns_diagnose_sip_target[cost: external_io (DNS via Cloudflare + Google; TLS handshake + a SIP OPTIONS keepalive to public targets when applicable) | read-only | rate-limited per IP: 10/min, 200/day] Walk DNS the same way a SIP UA does (RFC 3263 §4.1): NAPTR → SRV → A/AAAA. Given a SIP URI ("sip:exam...2 params

[cost: external_io (DNS via Cloudflare + Google; TLS handshake + a SIP OPTIONS keepalive to public targets when applicable) | read-only | rate-limited per IP: 10/min, 200/day] Walk DNS the same way a SIP UA does (RFC 3263 §4.1): NAPTR → SRV → A/AAAA. Given a SIP URI ("sip:exam...

Parameters* required
target*string
SIP URI ("sip:example.com"), "example.com:5060", or bare hostname ("example.com"). Userinfo is stripped before lookup.
transportstring
Transport hint. "any" surfaces all NAPTR services; specific transports filter the SRV walk to that service.one of any · udp · tcp · tls · ws · wssdefault: any
fetch_sipflow_share[cost: external_io (Mongo + S3 fetch on the Sipflow backend) | read-only, no persistence | rate limit: shared with the public share endpoint] Given a Sipflow share URL (https://sipflow.dev/share/<token>, or any sipflow.dev subdomain that serves /share/<token>), load the shared...1 params

[cost: external_io (Mongo + S3 fetch on the Sipflow backend) | read-only, no persistence | rate limit: shared with the public share endpoint] Given a Sipflow share URL (https://sipflow.dev/share/<token>, or any sipflow.dev subdomain that serves /share/<token>), load the shared...

Parameters* required
url*string
Full Sipflow share URL. Example: "https://sipflow.dev/share/eyJqb2JJZCI6Ii4uLiJ9.abc123". The path must be /share/<token>; /api/share/... endpoints are not accepted.
submit_sipflow_feedback[cost: write (single MongoDB row) | rate-limited per IP: 3/min, 20/day] Send the Sipflow team feedback when something doesn't work, a vendor or RFC isn't covered, or a tool produced a wrong/incomplete answer. Categories: - docs_gap: search_sip_docs returned nothing useful, ven...9 params

[cost: write (single MongoDB row) | rate-limited per IP: 3/min, 20/day] Send the Sipflow team feedback when something doesn't work, a vendor or RFC isn't covered, or a tool produced a wrong/incomplete answer. Categories: - docs_gap: search_sip_docs returned nothing useful, ven...

Parameters* required
category*string
Bucket. Use docs_gap for missing RAG coverage, tool_bug for broken behavior, wrong_answer for incorrect output, feature_request for new asks, general for anything else.one of docs_gap · tool_bug · wrong_answer · feature_request · general
contactstring
Optional email the user can be reached at. Only include when the user explicitly provides one and asks you to attach it.
detailsstring
Longer description: what the user was trying to do, what happened, what they expected. PII-free.
relatedQuerystring
The search query / question that failed or returned poor results. PII-free.
relatedToolstring
Name of the Sipflow MCP tool the feedback relates to, if any (e.g. `search_sip_docs`, `troubleshoot_response_code`).
summary*string
Short one-line description of the feedback. Will be shown to humans triaging. PII-free.
traceExcerptstring
Optional sanitized SIP message text the user explicitly approved attaching. Use the output of `minimize_sip_trace` (or a hand-scrubbed Via/From/To/Call-ID/CSeq block, optionally with minimal SDP)....
userConsent*boolean
MUST be true. Set this only after you have shown the user the exact payload above (including any `traceExcerpt`) and they have confirmed they want it sent.
vendorOrTopicstring
Vendor slug, RFC number, or topic the feedback relates to (e.g. 'freeswitch', 'RFC 3261', 'fax-over-IP').

Sponsors

Readme

Sipflow MCP

SIP/VoIP/telecom grounding for AI agents. Vendor docs across ~40 stacks, 60+ RFCs, STIR/SHAKEN, trace and config analysis - every answer cites a verbatim source_url.

smithery badge

Sipflow is a hosted, read-only Model Context Protocol server. It gives your editor or agent ~20 tools that ground SIP/VoIP answers in a curated corpus instead of training-data recall.

Install

Cursor (one-click)

Install Sipflow in Cursor

Or from the Cursor Marketplace. This repo also ships as a Cursor plugin with a bundled Skill and Rule (see What's in this repo below).

Cursor (manual) - ~/.cursor/mcp.json


View the full README on GitHub

Details

Repository
github.com/cmendes0101/sipflow-cursor-plugin
Website
www.sipflow.dev
Transport
HTTP
Registry
MCP registry, active
Tools verified
Nov 6, 2026