Phantom.Tracker (phantom_mcp v0.4.4)

Copy Markdown View Source

Track open streams so that notifications and requests can be sent to clients.

Add to your supervision tree:

{Phoenix.PubSub, name: MyApp.PubSub},
{Phantom.Tracker, [name: Phantom.Tracker, pubsub_server: MyApp.PubSub]},

For example, a request may need to elicit more input from the client, so the first request stream will remain open, and the notification stream will send and new request to the client, and the client will POST its response. The new response connection will notify the first request connection with the result and the tool can continue with the elicited information.

See Phantom section for more information.

Summary

Functions

Returns a specification to start this module under a supervisor.

Fetch the PID of the open request by ID

Fetch the full metadata map of the open request by ID

Fetch the PID of the open session by ID

Get metadata for a tracked session.

Return a list of all open requests

Return a list of all listening for resources

Return all tracked streams for a given session ID (across all nodes)

Return a list of all open sessions

Notify tracked sessions that a URL elicitation has completed

Notify any listening MCP sessions that the list of prompts has updated

Notify any listening MCP sessions that the list of prompts has updated

Notify any listening MCP sessions that the resource has updated

Notify any listening MCP sessions that the list of tools has updated

Subscribe the process to resource notifications from the PubSub on topic "phantom:resources"

Claim an in-flight JSON-RPC request for a session to prevent double-dispatch when the same tools/call lands on two nodes (e.g. proxy retry). Returns :ok if the claim is held by this node alone, :duplicate if another node has already claimed it.

Unsubscribe the process to resource notifications from the PubSub on topic "phantom:resources"

Untrack the processe for everything

Release an in-flight claim taken by track_in_flight/2.

Untrack any processes for the request

Untrack any processes for the session

Update metadata for a tracked session.

Functions

available?()

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

get_request(request_id)

Fetch the PID of the open request by ID

get_request_meta(request_id)

Fetch the full metadata map of the open request by ID

get_session(session_id)

Fetch the PID of the open session by ID

get_session_meta(session_id)

Get metadata for a tracked session.

Falls back to process dictionary when Phoenix.Tracker is not tracking.

list_requests()

Return a list of all open requests

list_resource_listeners()

Return a list of all listening for resources

list_session_streams(session_id)

Return all tracked streams for a given session ID (across all nodes)

list_sessions()

Return a list of all open sessions

notify_elicitation_complete(elicitation_id)

Notify tracked sessions that a URL elicitation has completed

notify_prompt_list()

Notify any listening MCP sessions that the list of prompts has updated

notify_resource_list()

Notify any listening MCP sessions that the list of prompts has updated

notify_resource_updated(uri)

Notify any listening MCP sessions that the resource has updated

notify_tool_list()

Notify any listening MCP sessions that the list of tools has updated

requests_topic()

resource_subscription_topic()

sessions_topic()

subscribe_resource(uri)

Subscribe the process to resource notifications from the PubSub on topic "phantom:resources"

track_in_flight(session_id, request_id)

Claim an in-flight JSON-RPC request for a session to prevent double-dispatch when the same tools/call lands on two nodes (e.g. proxy retry). Returns :ok if the claim is held by this node alone, :duplicate if another node has already claimed it.

Stored on the phantom:requests topic alongside server-initiated request tracking. The {:in_flight, session_id, request_id} tuple key never collides with elicitation keys (binaries), so both kinds of tracking share one replication stream.

The check is best-effort against Phoenix.Tracker replication lag: two nodes racing can both see :ok. Callers should treat this as a hint and combine with deterministic request IDs for defence in depth.

track_request(pid, request_id, meta \\ %{})

Track a request PID

track_session(pid, session_id, meta \\ %{})

Track a session PID

unsubscribe_resource(uri)

Unsubscribe the process to resource notifications from the PubSub on topic "phantom:resources"

untrack(pid)

Untrack the processe for everything

untrack_in_flight(session_id, request_id)

Release an in-flight claim taken by track_in_flight/2.

untrack_request(request_id)

Untrack any processes for the request

untrack_session(session_id)

Untrack any processes for the session

update_session_meta(session_id, meta)

Update metadata for a tracked session.

Falls back to process dictionary when Phoenix.Tracker is not tracking (e.g. stdio transport).