teams-api 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,19 +25,6 @@ Designed for autonomous AI agents that need to interact with Teams: read message
25
25
 
26
26
  The quickest way to get started is to click one of the install badges above, or follow the instructions for your editor below.
27
27
 
28
- #### Install as an agent skill
29
-
30
- The [SKILL.md](SKILL.md) teaches AI agents _how_ to use the MCP tools (when to call which tool, typical workflows, parameter guidance). Install it with the [`skills` CLI](https://github.com/vercel-labs/skills):
31
-
32
- ```bash
33
- npx -y skills add Maxim-Mazurok/teams-api
34
- ```
35
-
36
- This copies the skill into your agent's skills directory (Claude Code, Cursor, GitHub Copilot, Codex, and [many more](https://www.npmjs.com/package/skills#supported-agents)).
37
-
38
- > [!NOTE]
39
- > The skill is optional — the MCP tools work without it. The skill just gives agents extra context about when and how to use each tool.
40
-
41
28
  #### Editor-specific instructions
42
29
 
43
30
  <details>
@@ -393,7 +380,7 @@ All MCP tools accept an optional `format` parameter (`json`, `text`, `md`, or `t
393
380
  | `teams_get_transcript` | Get a meeting transcript from a recorded conversation |
394
381
  | `teams_whoami` | Get the authenticated user's display name |
395
382
 
396
- See [SKILL.md](SKILL.md) for detailed tool descriptions and typical agent workflows.
383
+ Workflow guidance, tips, and important notes are served automatically via the MCP server's `instructions` field — no separate skill file needed. For the same content on the CLI, run `teams-api guide`.
397
384
 
398
385
  ## API regions
399
386
 
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Conversation-related action definitions.
3
+ *
4
+ * Actions: list-conversations, find-conversation, find-one-on-one.
5
+ */
6
+ import { type ActionDefinition } from "./formatters.js";
7
+ export declare const listConversations: ActionDefinition;
8
+ export declare const findConversation: ActionDefinition;
9
+ export declare const findOneOnOne: ActionDefinition;
10
+ //# sourceMappingURL=conversation-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-actions.d.ts","sourceRoot":"","sources":["../../src/actions/conversation-actions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,iBAAiB,CAAC;AAEpE,eAAO,MAAM,iBAAiB,EAAE,gBAmE/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAqD9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,gBA2C1B,CAAC"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Conversation-related action definitions.
4
+ *
5
+ * Actions: list-conversations, find-conversation, find-one-on-one.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.findOneOnOne = exports.findConversation = exports.listConversations = void 0;
9
+ const formatters_js_1 = require("./formatters.js");
10
+ exports.listConversations = {
11
+ name: "list-conversations",
12
+ title: "List Teams Conversations",
13
+ description: "List conversations (chats, group chats, meetings, channels). " +
14
+ "Returns conversation ID, topic, type, member count, and last message time.",
15
+ parameters: [
16
+ {
17
+ name: "limit",
18
+ type: "number",
19
+ description: "Maximum number of conversations to return",
20
+ required: false,
21
+ default: 50,
22
+ },
23
+ ],
24
+ execute: async (client, parameters) => {
25
+ const limit = parameters.limit ?? 50;
26
+ return client.listConversations({ pageSize: limit });
27
+ },
28
+ formatResult: (result) => {
29
+ const conversations = result;
30
+ const lines = [`\n${conversations.length} conversations:\n`];
31
+ for (let i = 0; i < conversations.length; i++) {
32
+ const conversation = conversations[i];
33
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
34
+ const topic = conversation.topic || "(untitled 1:1 chat)";
35
+ lines.push(` [${i}] ${conversation.threadType}: "${topic}" ` +
36
+ `(members: ${conversation.memberCount ?? "?"}, last: ${lastMessage})`);
37
+ }
38
+ return lines.join("\n");
39
+ },
40
+ formatMarkdown: (result) => {
41
+ const conversations = result;
42
+ const lines = [`## Conversations (${conversations.length})`, ""];
43
+ if (conversations.length === 0)
44
+ return lines.join("\n");
45
+ lines.push("| # | Topic | Type | Members | Last Message |");
46
+ lines.push("|---|-------|------|---------|--------------|");
47
+ for (let i = 0; i < conversations.length; i++) {
48
+ const conversation = conversations[i];
49
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
50
+ const topic = conversation.topic || "(untitled 1:1 chat)";
51
+ lines.push(`| ${i} | ${topic} | ${conversation.threadType} | ${conversation.memberCount ?? "?"} | ${lastMessage} |`);
52
+ }
53
+ return lines.join("\n");
54
+ },
55
+ formatToon: (result) => {
56
+ const conversations = result;
57
+ const lines = [(0, formatters_js_1.toonHeader)("📋", `${conversations.length} Conversations`)];
58
+ for (let i = 0; i < conversations.length; i++) {
59
+ const conversation = conversations[i];
60
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
61
+ const topic = conversation.topic || "(untitled 1:1 chat)";
62
+ lines.push("");
63
+ lines.push(` 💬 [${i}] "${topic}"`);
64
+ lines.push(` ${conversation.threadType} · ${conversation.memberCount ?? "?"} members · last: ${lastMessage}`);
65
+ }
66
+ return lines.join("\n");
67
+ },
68
+ };
69
+ exports.findConversation = {
70
+ name: "find-conversation",
71
+ title: "Find Teams Conversation",
72
+ description: "Find a conversation by topic name (case-insensitive partial match). " +
73
+ "When Substrate search is available, also matches by member names. " +
74
+ "For 1:1 chats (which have no topic), use find-one-on-one instead. " +
75
+ "Use the returned conversation ID for subsequent operations like get-messages or send-message.",
76
+ parameters: [
77
+ {
78
+ name: "query",
79
+ type: "string",
80
+ description: "Partial topic name to search for",
81
+ required: true,
82
+ },
83
+ ],
84
+ execute: async (client, parameters) => {
85
+ const query = parameters.query;
86
+ return client.findConversation(query);
87
+ },
88
+ formatResult: (result) => {
89
+ if (!result)
90
+ return "No conversation found.";
91
+ const conversation = result;
92
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
93
+ return (`Found: "${conversation.topic}" ` +
94
+ `(${conversation.id}, ${conversation.threadType}, ` +
95
+ `members: ${conversation.memberCount ?? "?"}, last: ${lastMessage})`);
96
+ },
97
+ formatMarkdown: (result) => {
98
+ if (!result)
99
+ return "No conversation found.";
100
+ const conversation = result;
101
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
102
+ return [
103
+ `## Found: "${conversation.topic}"`,
104
+ "",
105
+ `- **ID:** ${conversation.id}`,
106
+ `- **Type:** ${conversation.threadType}`,
107
+ `- **Members:** ${conversation.memberCount ?? "?"}`,
108
+ `- **Last message:** ${lastMessage}`,
109
+ ].join("\n");
110
+ },
111
+ formatToon: (result) => {
112
+ if (!result)
113
+ return "\n 🔍 No conversation found.";
114
+ const conversation = result;
115
+ const lastMessage = conversation.lastMessageTime?.slice(0, 10) ?? "unknown";
116
+ return [
117
+ (0, formatters_js_1.toonHeader)("🔍", `Found: "${conversation.topic}"`),
118
+ ` 🆔 ${conversation.id}`,
119
+ ` 📁 ${conversation.threadType} · ${conversation.memberCount ?? "?"} members · last: ${lastMessage}`,
120
+ ].join("\n");
121
+ },
122
+ };
123
+ exports.findOneOnOne = {
124
+ name: "find-one-on-one",
125
+ title: "Find 1:1 Conversation",
126
+ description: "Find a 1:1 conversation with a person by name. " +
127
+ "Uses Substrate people/chat search when available, " +
128
+ "falls back to scanning message senders. " +
129
+ "Also finds the self-chat if the name matches the current user.",
130
+ parameters: [
131
+ {
132
+ name: "personName",
133
+ type: "string",
134
+ description: "Name of the person to find (case-insensitive partial match)",
135
+ required: true,
136
+ },
137
+ ],
138
+ execute: async (client, parameters) => {
139
+ const personName = parameters.personName;
140
+ return client.findOneOnOneConversation(personName);
141
+ },
142
+ formatResult: (result) => {
143
+ if (!result)
144
+ return "No 1:1 conversation found.";
145
+ const searchResult = result;
146
+ return `Found 1:1 with ${searchResult.memberDisplayName} (${searchResult.conversationId})`;
147
+ },
148
+ formatMarkdown: (result) => {
149
+ if (!result)
150
+ return "No 1:1 conversation found.";
151
+ const searchResult = result;
152
+ return [
153
+ `## Found 1:1 with ${searchResult.memberDisplayName}`,
154
+ "",
155
+ `- **Conversation ID:** ${searchResult.conversationId}`,
156
+ ].join("\n");
157
+ },
158
+ formatToon: (result) => {
159
+ if (!result)
160
+ return "\n 🔍 No 1:1 conversation found.";
161
+ const searchResult = result;
162
+ return [
163
+ (0, formatters_js_1.toonHeader)("🔍", `Found 1:1 with ${searchResult.memberDisplayName}`),
164
+ ` 🆔 ${searchResult.conversationId}`,
165
+ ].join("\n");
166
+ },
167
+ };
168
+ //# sourceMappingURL=conversation-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-actions.js","sourceRoot":"","sources":["../../src/actions/conversation-actions.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,11 @@
1
1
  /**
2
- * All action definitions for the Teams API.
2
+ * Action registry the single source of truth for all Teams API operations.
3
3
  *
4
- * This is the single source of truth for all operations. CLI commands,
5
- * MCP tools, and programmatic usage all derive from these definitions.
6
- *
7
- * Each action declares:
8
- * - name, title, description — shared help text and documentation
9
- * - parameters — typed parameter definitions with descriptions and defaults
10
- * - execute — the implementation, calling TeamsClient methods
11
- * - formatResult — human-readable output formatter (CLI without --json)
4
+ * CLI commands, MCP tools, and programmatic usage all derive from these
5
+ * definitions. Individual action definitions live in domain-specific files;
6
+ * this module assembles them into the canonical registry.
12
7
  */
13
- import { type ActionDefinition } from "./formatters.js";
8
+ import type { ActionDefinition } from "./formatters.js";
14
9
  /** All registered actions, derived from the registry map. */
15
10
  export declare const actions: ActionDefinition[];
16
11
  //# sourceMappingURL=definitions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/actions/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,OAAO,EACL,KAAK,gBAAgB,EAMtB,MAAM,iBAAiB,CAAC;AAw7BzB,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,gBAAgB,EAAwC,CAAC"}
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/actions/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAqCxD,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,gBAAgB,EAAwC,CAAC"}