Stream MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
Query channels, search messages, and read threads, users and reactions in your Stream Chat app.
13 tools: 2 can delete or cancel things and 11 only read.
Scanned Oct 21, 2026
- Deletes or cancels2Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads11Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http stream https://stream.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
- Infostream_get_app
The description mentions "credentials".
What this check looks forMatched text
description: "...annel types. Good first call to confirm credentials and discover available channel types. G..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
13 tools
Deletes or cancels 2Claude Code: deny
stream_send_message⚠[U+FE0F] WRITE: post a new message to a channel, attributed to user_id (must be an existing user in the app).No findings
Why it is in this group
- The name "stream_send_message" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote itContains invisible characters, shown as [U+…] ⚠[U+FE0F] WRITE: post a new message to a channel, attributed to user_id (must be an existing user in the app). POST /api/v2/chat/channels/{type}/{id}/message.
Annotations the server declares
- title: Send a message
- destructiveHint: true
stream_send_reaction⚠[U+FE0F] WRITE: add a reaction (e.g.No findings
Why it is in this group
- The name "stream_send_reaction" says "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote itContains invisible characters, shown as [U+…] ⚠[U+FE0F] WRITE: add a reaction (e.g. "like", "love") to a message, attributed to user_id (must be an existing user). POST /api/v2/chat/messages/{id}/reaction.
Annotations the server declares
- title: Send a reaction
- destructiveHint: true
Only reads 11Claude Code: allow
stream_get_appFetch the Stream app's settings and configured channel types.1 finding
Why it is in this group
- The name "stream_get_app" says "get": a word for reading.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...annel types. Good first call to confirm credentials and discover available channel types. G..."
Description, as the server wrote it Fetch the Stream app's settings and configured channel types. Good first call to confirm credentials and discover available channel types. GET /api/v2/app.
Annotations the server declares
- title: Get app settings
- readOnlyHint: true
stream_get_channelFetch a single channel's state (config, members) and its most recent messages.No findings
Why it is in this group
- The name "stream_get_channel" says "get": a word for reading.
Description, as the server wrote it Fetch a single channel's state (config, members) and its most recent messages. Note: uses Stream's get-or-create endpoint — for an existing channel it reads; if the type/id does not exist it may be created empty. POST /api/v2/chat/channels/{type}/{id}/query.
Annotations the server declares
- title: Get channel state + recent messages
- readOnlyHint: true
stream_get_messageFetch a single message by its id.No findings
Why it is in this group
- The name "stream_get_message" says "get": a word for reading.
Description, as the server wrote it Fetch a single message by its id. GET /api/v2/chat/messages/{id}.
Annotations the server declares
- title: Get a message
- readOnlyHint: true
stream_get_reactionsList the reactions on a message.No findings
Why it is in this group
- The name "stream_get_reactions" says "get": a word for reading.
Description, as the server wrote it List the reactions on a message. GET /api/v2/chat/messages/{id}/reactions.
Annotations the server declares
- title: Get message reactions
- readOnlyHint: true
stream_get_repliesFetch the reply messages in a thread, given the parent message id.No findings
Why it is in this group
- The name "stream_get_replies" says "get": a word for reading.
Description, as the server wrote it Fetch the reply messages in a thread, given the parent message id. GET /api/v2/chat/messages/{parent_id}/replies.
Annotations the server declares
- title: Get thread replies
- readOnlyHint: true
stream_get_unread_countsFetch total and per-channel unread message/mention counts for one user.No findings
Why it is in this group
- The name "stream_get_unread_counts" says "get": a word for reading.
Description, as the server wrote it Fetch total and per-channel unread message/mention counts for one user. GET /api/v2/chat/unread.
Annotations the server declares
- title: Get unread counts for a user
- readOnlyHint: true
stream_query_channelsList/filter channels by a Stream query filter.No findings
Why it is in this group
- The name "stream_query_channels" says "query": a word for reading.
Description, as the server wrote it List/filter channels by a Stream query filter. e.g. filter {"type":"messaging"} or {"members":{"$in":["user-1"]}}. Returns channels with recent state. POST /api/v2/chat/channels.
Annotations the server declares
- title: Query channels
- readOnlyHint: true
stream_query_membersList/filter the members of one channel.No findings
Why it is in this group
- The name "stream_query_members" says "query": a word for reading.
Description, as the server wrote it List/filter the members of one channel. Requires the channel type + id. Optional member filter, e.g. {"name":{"$autocomplete":"jo"}}. GET /api/v2/chat/members.
Annotations the server declares
- title: Query channel members
- readOnlyHint: true
stream_query_threadsList threads (messages with replies).No findings
Why it is in this group
- The name "stream_query_threads" says "query": a word for reading.
Description, as the server wrote it List threads (messages with replies). Server-side calls should pass a user_id to scope thread read-state to that user. POST /api/v2/chat/threads.
Annotations the server declares
- title: Query threads
- readOnlyHint: true
stream_query_usersList/filter users in the app.No findings
Why it is in this group
- The name "stream_query_users" says "query": a word for reading.
Description, as the server wrote it List/filter users in the app. e.g. filter {"role":{"$eq":"admin"}} or {"id":{"$in":["u1"]}}. GET /api/v2/users.
Annotations the server declares
- title: Query users
- readOnlyHint: true
stream_search_messagesSearch messages across channels.No findings
Why it is in this group
- The name "stream_search_messages" says "search": a word for reading.
Description, as the server wrote it Search messages across channels. Scope with a channel filter (filter, e.g. {"type":"messaging"}) plus EITHER a full-text `query` OR a `message_filter` object (e.g. {"text":{"$q":"refund"}}). GET /api/v2/chat/search.
Annotations the server declares
- title: Search messages
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http stream https://stream.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__stream__stream_get_app",
"mcp__stream__stream_query_channels",
"mcp__stream__stream_get_channel",
"mcp__stream__stream_search_messages",
"mcp__stream__stream_get_message",
"mcp__stream__stream_get_replies",
"mcp__stream__stream_get_reactions",
"mcp__stream__stream_query_members",
"mcp__stream__stream_query_users",
"mcp__stream__stream_query_threads",
"mcp__stream__stream_get_unread_counts"
],
"ask": [],
"deny": [
"mcp__stream__stream_send_message",
"mcp__stream__stream_send_reaction"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as stream. Review it before you use it.