tools/call over
POST /teams/mcp. The connector reads Microsoft Teams through Microsoft Graph and is
connected through OAuth with a Microsoft work or school account (see
Connect Teams). Your organization needs access to Teams
(a subscription, or a plan that covers it, see
What decides access), and your user
must hold a seat or plan licence (assigned under Team in the portal, see
Team).
Endpoint:
https://mcp.consile.ai/teams/mcp. Teams is its own named connector with
only its own tools. Tool names are namespaced teams__<tool> (e.g.
teams__list_joined_teams); the bare names are used below for readability. A bare
name in a request returns Unknown tool.The connector is multi-instance: one instance is one connected Microsoft user (that
user’s teams, channels and chats). An administrator adds further connections
(agreements, aftaler, in the portal), each served at its own endpoint, e.g.
https://mcp.consile.ai/teams-2/mcp, with tools named teams-2__<tool>.tools/list returns the eight teams__* tools
plus the unprefixed system tool connect_account. Without access
only connect_account is listed, and the initialize result includes instructions
explaining how to get access. A user without a seat still sees the tools, but every
call is refused. Every tool has a title and the annotations readOnlyHint: true,
destructiveHint: false and openWorldHint: false. A successful result contains the
payload twice: as JSON text in content and as the same object in
structuredContent. The examples below show that payload.
Authorization and admin consent
The account is connected through Microsoft’s OAuth sign-in. Only work or school accounts can connect; Microsoft refuses a personal Microsoft account. The requested delegated permissions are all read permissions:https://graph.microsoft.com/Team.ReadBasic.Allhttps://graph.microsoft.com/Channel.ReadBasic.Allhttps://graph.microsoft.com/ChannelMessage.Read.Allhttps://graph.microsoft.com/Chat.Readhttps://graph.microsoft.com/User.Readoffline_access(keeps the connection alive)
ChannelMessage.Read.All requires admin consent in the customer’s Microsoft Entra
tenant; a regular user cannot grant it. Until an administrator has consented for the
organization, Microsoft stops a regular user’s sign-in at its Need admin approval
page. The connect is rejected, and nothing is stored, if Microsoft’s grant is missing
any of the five Graph permissions or contains a permission for a resource other than
Microsoft Graph. There is no chat-only connection. How the customer gives the consent:
Administrator consent.
The connector has no write tools and sends only read requests. Messages are read live
and not stored by Consile. Access is renewed automatically. Consile never hands the
token to the MCP client, and the MCP client’s own token is never forwarded to
Microsoft.
Shared conventions
The id chain
Teams content is addressed by ids a user never types, so the tools are meant to be called in order:list_joined_teamsreturns theteamId(a GUID).list_channelswith thatteamIdreturns thechannelId(the19:...@thread.tacv2form).list_channel_messageswith both returns root message ids, andlist_message_repliesreads one thread.
list_chats returns the chatId (the
19:...@unq.gbl.spaces form, or another 19: form for meeting chats) that
list_chat_messages takes.
Paging
list_channel_messages, list_message_replies, list_chats and
list_chat_messages are paged. Each returns count, items and nextCursor
(null on the last page). Pass nextCursor back as cursor to the same tool to get
the next page. When cursor is set, the other options (pageSize, since) are
ignored. list_joined_teams and list_channels return the whole list in one call.
integer
standard:"20"
Rows per page, 1 to 50. Microsoft Graph caps message pages at 50. The default is 20
on
list_channel_messages, list_chats and list_chat_messages, and 50 on
list_message_replies.string
The
nextCursor from a previous page of the same tool.Message shape
Channel messages, replies and chat messages share one shape:string
The message id.
string | null
ISO 8601 timestamps.
boolean
true for a deleted message.object | null
{ "name", "userId" } for a person, { "application" } for an app or bot, or
null.string | null
message for an ordinary message. System events (members added, calls) have
another value.string | null
As Teams reports them.
string
The message as plain text: HTML is reduced to text, line breaks are kept, and the
text of mentions and attachment placeholders stays. Cut at 10,000 characters.
boolean
true when body was cut. The cap is the same in every tool, including
get_channel_message.array
Each has
id, mentionText and userId.array
Each has
id, name, contentType and contentUrl. The file itself is not
fetched.integer
The number of reactions.
string | null
On a reply, the id of the root message it answers.
string | null
A link that opens the message in Teams.
object
{ "teamId", "channelId" }, present only when Microsoft returns it (channel
messages).list_joined_teams
Lists the teams the connected user is a member of. The usual first call. When several teams could match what the user means, ask instead of guessing. Arguments: none.array
Each item has
id (the teamId), displayName, description, isArchived,
visibility (public or private) and webUrl.get_team
Reads one team.string (GUID)
påkrævet
From
list_joined_teams.The same fields as
list_joined_teams, plus createdDateTime.object
membersCount, ownersCount and guestsCount. Present only when Microsoft reports
it.Request
list_channels
Lists the channels of a team that the connected user can see.string (GUID)
påkrævet
string
Only channels of one membership type:
standard (open to the whole team),
private (a subset of the team) or shared (shared across teams).array
Each item has
id (the channelId), displayName, description,
membershipType, webUrl and createdDateTime. The result also echoes teamId.list_channel_messages
Lists the root messages (conversation starters) of a channel, newest first. Replies are not included, and their number is not reported: calllist_message_replies with a message id to read a thread.
Microsoft offers no filtering, sorting or search here, so page through with
nextCursor. Requires the admin-consented ChannelMessage.Read.All. Microsoft
throttles these reads more tightly than other reads, so keep pages small.
string (GUID)
påkrævet
string
påkrævet
integer
standard:"20"
1 to 50.
string
teamId and channelId and has count, items (see
Message shape) and nextCursor.
get_channel_message
Reads one channel message by id: a root message fromlist_channel_messages or a
reply from list_message_replies. Useful when the user pasted a message link or
refers to one specific message.
string (GUID)
påkrævet
string
påkrævet
string
påkrævet
Request
list_message_replies
Lists the replies to a root channel message, i.e. one conversation thread, newest first. A reply’s ownreplyToId also names the root. Each reply has the
message shape. A thread is usually read whole, so the page defaults
to 50.
string (GUID)
påkrævet
string
påkrævet
string
påkrævet
The root message id.
integer
standard:"50"
1 to 50.
string
teamId, channelId and messageId and has count, items and
nextCursor.
list_chats
Lists the connected user’s own chats, most recently active first: 1:1 chats (chatType oneOnOne), group chats (group) and meeting chats (meeting). A 1:1
chat has no topic, so identify it by its members.
integer
standard:"20"
1 to 50.
string
array
Each item has
id (the chatId), topic (group chats only), chatType,
members (each with name, userId and email), lastUpdatedDateTime and
webUrl.list_chat_messages
Lists the messages of one chat, newest first. System events (members added, calls) appear with amessageType other than message.
string
påkrævet
From
list_chats.string
Only messages modified after this instant. ISO 8601 with
Z or an offset, e.g.
2026-10-01T00:00:00Z. The only filter Microsoft supports here.integer
standard:"20"
1 to 50.
string
chatId and has count, items (see
Message shape) and nextCursor.
Request
connect_account
connect_account is a system tool that the Teams endpoint lists next to the eight
tools. It takes no arguments and its name has no teams__ prefix. It returns
{ "connect_url": "…", "instructions": "…" }. The user opens connect_url in a
browser and is sent to Microsoft to sign in and approve access. The link expires
after 10 minutes. It only works for accounts that subscribe to Teams and for users who
have accepted Consile’s terms in the portal. Use it to reconnect after the access
expired or was removed. The admin-consent requirement
applies here too.
Request
Errors
Tool failures come back as a normaltools/call result with isError: true and one
text block, not as a JSON-RPC error. The connector returns explanatory messages for
the common failures:
Limits
- Page size: 1 to 50 rows on every paged tool (Microsoft Graph’s cap on message
pages). Defaults: 20, and 50 on
list_message_replies. - Message text:
bodyis cut at 10,000 characters (bodyTruncated: true). - Microsoft throttles channel-message reads more tightly than other Graph reads. Prefer small pages and stop paging once the question is answered.
429 (JSON-RPC error -32029, Retry-After: 1)
instead of a tool result. See Errors & limits for
the current limits and the protocol-level errors shared by all connectors.