🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@robinpath/teams

Package Overview
Dependencies
Maintainers
4
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@robinpath/teams - npm Package Compare versions

Comparing version
0.1.1
to
0.3.0
+6
dist/index.d.ts
import type { ModuleAdapter } from "@robinpath/core";
declare const TeamsModule: ModuleAdapter;
export default TeamsModule;
export { TeamsModule };
export { TeamsFunctions, TeamsFunctionMetadata, TeamsModuleMetadata, TeamsCredentialTypes, } from "./teams.js";
//# sourceMappingURL=index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,WAAW,EAAE,aAQlB,CAAC;AAEF,eAAe,WAAW,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
import { TeamsFunctions, TeamsFunctionMetadata, TeamsModuleMetadata, TeamsCredentialTypes, configureTeams, } from "./teams.js";
const TeamsModule = {
name: "teams",
functions: TeamsFunctions,
functionMetadata: TeamsFunctionMetadata,
moduleMetadata: TeamsModuleMetadata,
credentialTypes: TeamsCredentialTypes,
configure: configureTeams,
global: false,
};
export default TeamsModule;
export { TeamsModule };
export { TeamsFunctions, TeamsFunctionMetadata, TeamsModuleMetadata, TeamsCredentialTypes, } from "./teams.js";
//# sourceMappingURL=index.js.map
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,GAAkB;IACjC,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,cAAc;IACzB,gBAAgB,EAAE,qBAAqB;IACvC,cAAc,EAAE,mBAAmB;IACnC,eAAe,EAAE,oBAAoB;IACrC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,WAAW,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
/**
* RobinPath Microsoft Teams Module (Node port)
*
* Microsoft Teams integration via the Microsoft Graph API
* (https://graph.microsoft.com/v1.0/teams/ + /chats/ + /me/joinedTeams).
* Covers team + channel enumeration, channel messaging (send / reply / list),
* channel CRUD, 1:1 + group chat messaging, and incoming-webhook posts.
*
* Modeled on the outlook node module — same `microsoft_graph` credential
* contract (`access_token` or `client_credentials`) so users reuse a single
* credential across the MS suite.
*
* Authentication caveats for Teams:
* - Many chat and channel-messaging scopes are "protected APIs" that
* require Microsoft-gated admin consent (see
* https://learn.microsoft.com/en-us/graph/teams-protected-apis). If a
* call returns 403 `InvalidDelegatedRequest` / `AccessDenied`, request
* the appropriate permissions in the Azure portal.
* - `sendWebhook` bypasses Graph entirely — it POSTs to a public Incoming
* Webhook URL (or Teams Workflow HTTP webhook) and needs no credential.
* In that case the first argument is the URL, not a credential slug.
*/
import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core";
export declare function configureTeams(h: ModuleHost): void;
export declare const TeamsFunctions: Record<string, BuiltinHandler>;
export declare const TeamsCredentialTypes: CredentialTypeSchema[];
export declare const TeamsFunctionMetadata: Record<string, FunctionMetadata>;
export declare const TeamsModuleMetadata: ModuleMetadata;
//# sourceMappingURL=teams.d.ts.map
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../src/teams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAElD;AAgsBD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAUzD,CAAC;AAIF,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,EA0EtD,CAAC;AA0FF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA+TlE,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,cAkCjC,CAAC"}
/**
* RobinPath Microsoft Teams Module (Node port)
*
* Microsoft Teams integration via the Microsoft Graph API
* (https://graph.microsoft.com/v1.0/teams/ + /chats/ + /me/joinedTeams).
* Covers team + channel enumeration, channel messaging (send / reply / list),
* channel CRUD, 1:1 + group chat messaging, and incoming-webhook posts.
*
* Modeled on the outlook node module — same `microsoft_graph` credential
* contract (`access_token` or `client_credentials`) so users reuse a single
* credential across the MS suite.
*
* Authentication caveats for Teams:
* - Many chat and channel-messaging scopes are "protected APIs" that
* require Microsoft-gated admin consent (see
* https://learn.microsoft.com/en-us/graph/teams-protected-apis). If a
* call returns 403 `InvalidDelegatedRequest` / `AccessDenied`, request
* the appropriate permissions in the Azure portal.
* - `sendWebhook` bypasses Graph entirely — it POSTs to a public Incoming
* Webhook URL (or Teams Workflow HTTP webhook) and needs no credential.
* In that case the first argument is the URL, not a credential slug.
*/
// ── Module-local state (populated by configure hook) ────────────────────
const state = {};
function host() {
if (!state.host) {
throw new Error("Teams module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first.");
}
return state.host;
}
export function configureTeams(h) {
state.host = h;
}
// ── Constants ──────────────────────────────────────────────────────────
const GRAPH_API = "https://graph.microsoft.com/v1.0";
const DEFAULT_SCOPE = "https://graph.microsoft.com/.default";
const CREDENTIAL_TYPE = "microsoft_graph";
const TOKEN_TTL_MS = 50 * 60 * 1000;
const tokenCache = new Map();
function cacheGet(key) {
const entry = tokenCache.get(key);
if (!entry)
return null;
if (entry.expiresAt <= Date.now()) {
tokenCache.delete(key);
return null;
}
return entry.token;
}
function cacheSet(key, token, ttlMs = TOKEN_TTL_MS) {
tokenCache.set(key, { token, expiresAt: Date.now() + ttlMs });
}
function errorReturn(error, code, extra = {}) {
return { error, code, ...extra };
}
function isErrorReturn(v) {
return !!v && typeof v === "object" && "error" in v && "code" in v;
}
async function resolveCredential(credentialSlug) {
if (!credentialSlug) {
return errorReturn("Credential slug is required.", "credential_not_found");
}
let fields;
try {
fields = await host().credentials.get(credentialSlug);
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found");
}
if (!fields) {
return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found");
}
const mode = String(fields.auth_mode ?? "access_token");
if (mode === "client_credentials") {
return resolveClientCredentialsToken(credentialSlug, fields);
}
return resolveAccessToken(credentialSlug, fields);
}
async function resolveAccessToken(credentialSlug, fields) {
const token = String(fields.access_token ?? "");
const refreshToken = String(fields.refresh_token ?? "");
const clientId = String(fields.client_id ?? "");
const clientSecret = String(fields.client_secret ?? "");
const tenantId = String(fields.tenant_id ?? "common");
if (refreshToken && clientId && clientSecret) {
const cacheKey = `refresh|${credentialSlug}|${refreshToken}`;
const cached = cacheGet(cacheKey);
if (cached) {
return {
token: cached,
user: "",
credentialSlug,
fields,
mode: "access_token",
};
}
}
if (token) {
return {
token,
user: "",
credentialSlug,
fields,
mode: "access_token",
};
}
if (!refreshToken || !clientId || !clientSecret) {
return errorReturn("Credential has no `access_token`, and not enough info to refresh (need refresh_token + client_id + client_secret + tenant_id).", "token_missing");
}
const refreshed = await refreshAccessToken(credentialSlug, refreshToken, clientId, clientSecret, tenantId);
if (isErrorReturn(refreshed))
return refreshed;
return {
token: refreshed.token,
user: "",
credentialSlug,
fields,
mode: "access_token",
};
}
async function refreshAccessToken(credentialSlug, refreshToken, clientId, clientSecret, tenantId) {
const tenant = tenantId || "common";
const url = `https://login.microsoftonline.com/${encodeURIComponent(tenant)}/oauth2/v2.0/token`;
const body = new URLSearchParams({
grant_type: "refresh_token",
refresh_token: refreshToken,
client_id: clientId,
client_secret: clientSecret,
scope: "https://graph.microsoft.com/.default offline_access",
}).toString();
let response;
try {
response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body,
});
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const raw = await response.text();
let decoded = {};
try {
decoded = raw ? JSON.parse(raw) : {};
}
catch {
decoded = {};
}
const status = response.status;
const accessToken = String(decoded.access_token ?? "");
if (status < 200 || status >= 300 || !accessToken) {
const msg = String(decoded.error_description ?? decoded.error ?? "Refresh failed.");
return errorReturn(msg, "token_exchange_failed", { status });
}
const expiresIn = Number(decoded.expires_in ?? 0);
const ttlMs = expiresIn > 0 ? Math.max(60_000, (expiresIn - 300) * 1000) : TOKEN_TTL_MS;
cacheSet(`refresh|${credentialSlug}|${refreshToken}`, accessToken, ttlMs);
await writeBackAccessToken(credentialSlug, accessToken);
return { token: accessToken };
}
async function writeBackAccessToken(slug, newToken) {
try {
const current = (await host().credentials.get(slug)) ?? {};
await host().credentials.set(slug, CREDENTIAL_TYPE, {
...current,
access_token: newToken,
});
}
catch {
// Best-effort.
}
}
async function resolveClientCredentialsToken(credentialSlug, fields) {
const clientId = String(fields.client_id ?? "");
const clientSecret = String(fields.client_secret ?? "");
const tenantId = String(fields.tenant_id ?? "");
const defaultUser = String(fields.default_user ?? "");
if (!clientId || !clientSecret || !tenantId) {
return errorReturn("client_credentials mode requires `client_id`, `client_secret`, and `tenant_id`.", "token_missing");
}
if (!defaultUser) {
return errorReturn("client_credentials mode requires `default_user` (no `/me` in app-only auth). Set it to a user UPN or object ID.", "token_missing");
}
const cacheKey = `cc|${tenantId}|${clientId}|${clientSecret}`;
const cached = cacheGet(cacheKey);
if (cached) {
return {
token: cached,
user: defaultUser,
credentialSlug,
fields,
mode: "client_credentials",
};
}
const url = `https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/oauth2/v2.0/token`;
const body = new URLSearchParams({
grant_type: "client_credentials",
client_id: clientId,
client_secret: clientSecret,
scope: DEFAULT_SCOPE,
}).toString();
let response;
try {
response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body,
});
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const raw = await response.text();
let decoded = {};
try {
decoded = raw ? JSON.parse(raw) : {};
}
catch {
decoded = {};
}
const status = response.status;
const accessToken = String(decoded.access_token ?? "");
if (status < 200 || status >= 300 || !accessToken) {
const msg = String(decoded.error_description ?? decoded.error ?? "Token exchange failed.");
return errorReturn(msg, "token_exchange_failed", { status });
}
const expiresIn = Number(decoded.expires_in ?? 0);
const ttlMs = expiresIn > 0 ? Math.max(60_000, (expiresIn - 300) * 1000) : TOKEN_TTL_MS;
cacheSet(cacheKey, accessToken, ttlMs);
return {
token: accessToken,
user: defaultUser,
credentialSlug,
fields,
mode: "client_credentials",
};
}
// ── HTTP — Microsoft Graph ─────────────────────────────────────────────
async function call(cred, method, relativePath, body, extraHeaders = {}) {
const resolved = await resolveCredential(cred);
if (isErrorReturn(resolved))
return resolved;
return callWithToken(resolved, method, relativePath, body, extraHeaders);
}
async function callWithToken(resolved, method, relativePath, body, extraHeaders) {
const url = `${GRAPH_API}/${relativePath.replace(/^\/+/, "")}`;
const headers = {
Authorization: `Bearer ${resolved.token}`,
"Content-Type": "application/json",
Accept: "application/json",
...extraHeaders,
};
const init = { method, headers };
if (body !== null && body !== undefined) {
init.body = JSON.stringify(body);
}
let response;
try {
response = await fetch(url, init);
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const status = response.status;
const rawBody = await response.text();
let decoded;
try {
decoded = rawBody ? JSON.parse(rawBody) : null;
}
catch {
decoded = { raw: rawBody };
}
if (status >= 200 && status < 300) {
if (rawBody === "" || decoded === null)
return { ok: true, status };
if (decoded && typeof decoded === "object")
return decoded;
return { raw: rawBody };
}
const err = decoded && typeof decoded === "object" && "error" in decoded
? decoded.error
: null;
const graphCode = err && typeof err === "object" && "code" in err
? String(err.code ?? "")
: "";
let message = `Microsoft Graph returned HTTP ${status}.`;
if (err && typeof err === "object" && "message" in err) {
message = String(err.message);
}
else if (typeof err === "string") {
message = err;
}
let code = "graph_error";
switch (status) {
case 401:
code = "token_missing";
break;
case 403:
code = "permission_denied";
break;
case 404:
code = "not_found";
break;
case 400:
code = "validation_failed";
break;
case 429:
code = "rate_limited";
break;
}
if (graphCode === "InvalidAuthenticationToken")
code = "token_missing";
if (graphCode === "Forbidden" || graphCode === "AccessDenied")
code = "permission_denied";
const result = {
error: message,
code,
status,
graph_error: decoded && typeof decoded === "object" ? decoded : { raw: rawBody },
};
if (status === 429) {
const retryAfter = response.headers.get("retry-after");
if (retryAfter) {
result.retry_after = /^\d+$/.test(retryAfter)
? parseInt(retryAfter, 10)
: retryAfter;
}
}
return result;
}
// ── OData helper ───────────────────────────────────────────────────────
function odataSuffix(opts) {
if (!opts || Object.keys(opts).length === 0)
return "";
const parts = [];
for (const [k, rawV] of Object.entries(opts)) {
if (rawV === null || rawV === undefined || rawV === "")
continue;
if (k === "consistencyLevel")
continue;
let v;
if (typeof rawV === "boolean")
v = rawV ? "true" : "false";
else if (typeof rawV === "object")
v = JSON.stringify(rawV);
else
v = String(rawV);
parts.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
return parts.length ? "?" + parts.join("&") : "";
}
// ── Message builder ────────────────────────────────────────────────────
/**
* Build a Graph chatMessage body. Accepts either a shorthand string
* (plain text) or a full object. `contentType` defaults to "html" but the
* caller can flip to "text".
*/
function buildMessageBody(messageOrFields) {
if (typeof messageOrFields === "string") {
if (messageOrFields === "") {
return errorReturn("Message body is empty.", "validation_failed");
}
return { body: { content: messageOrFields, contentType: "html" } };
}
if (messageOrFields &&
typeof messageOrFields === "object" &&
!Array.isArray(messageOrFields)) {
const obj = messageOrFields;
if (obj.body && typeof obj.body === "object" && !Array.isArray(obj.body)) {
// Already shaped correctly.
return obj;
}
if (typeof obj.content === "string") {
const contentType = String(obj.contentType ?? "html");
const out = {
body: { content: String(obj.content), contentType },
};
// Pass through extra top-level fields (subject, importance, mentions, attachments).
for (const k of ["subject", "importance", "mentions", "attachments", "summary"]) {
if (k in obj)
out[k] = obj[k];
}
return out;
}
}
return errorReturn("Message must be a string or `{content, contentType?}` object.", "validation_failed");
}
// ── Handlers — Teams ───────────────────────────────────────────────────
const listTeams = async (args) => {
const cred = String(args[0] ?? "");
// Delegated: /me/joinedTeams. App-only: /users/{default_user}/joinedTeams.
const resolved = await resolveCredential(cred);
if (isErrorReturn(resolved))
return resolved;
const path = resolved.user === ""
? "me/joinedTeams"
: `users/${encodeURIComponent(resolved.user)}/joinedTeams`;
return (await callWithToken(resolved, "GET", path, null, {}));
};
// ── Handlers — Channels ────────────────────────────────────────────────
const listChannels = async (args) => {
const cred = String(args[0] ?? "");
const teamId = String(args[1] ?? "");
const opts = args[2] && typeof args[2] === "object" && !Array.isArray(args[2])
? args[2]
: {};
if (!teamId) {
return errorReturn("teamId is required.", "validation_failed");
}
const suffix = odataSuffix(opts);
return (await call(cred, "GET", `teams/${encodeURIComponent(teamId)}/channels${suffix}`, null));
};
const createChannel = async (args) => {
const cred = String(args[0] ?? "");
const teamId = String(args[1] ?? "");
const displayName = String(args[2] ?? "");
const opts = args[3] && typeof args[3] === "object" && !Array.isArray(args[3])
? args[3]
: {};
if (!teamId || !displayName) {
return errorReturn("teamId and displayName are required.", "validation_failed");
}
const body = {
displayName,
membershipType: String(opts.membershipType ?? "standard"),
};
if (opts.description)
body.description = String(opts.description);
return (await call(cred, "POST", `teams/${encodeURIComponent(teamId)}/channels`, body));
};
// ── Handlers — Channel messages ────────────────────────────────────────
const sendChannel = async (args) => {
const cred = String(args[0] ?? "");
const teamId = String(args[1] ?? "");
const channelId = String(args[2] ?? "");
const message = args[3];
if (!teamId || !channelId) {
return errorReturn("teamId and channelId are required.", "validation_failed");
}
const body = buildMessageBody(message);
if (isErrorReturn(body))
return body;
return (await call(cred, "POST", `teams/${encodeURIComponent(teamId)}/channels/${encodeURIComponent(channelId)}/messages`, body));
};
const getMessages = async (args) => {
const cred = String(args[0] ?? "");
const teamId = String(args[1] ?? "");
const channelId = String(args[2] ?? "");
const opts = args[3] && typeof args[3] === "object" && !Array.isArray(args[3])
? args[3]
: {};
if (!teamId || !channelId) {
return errorReturn("teamId and channelId are required.", "validation_failed");
}
// Back-compat: the old module accepted `{top: N}` — translate to `$top`.
const qs = { ...opts };
if (qs.top !== undefined && qs.$top === undefined) {
qs.$top = qs.top;
delete qs.top;
}
const suffix = odataSuffix(qs);
return (await call(cred, "GET", `teams/${encodeURIComponent(teamId)}/channels/${encodeURIComponent(channelId)}/messages${suffix}`, null));
};
const replyToMessage = async (args) => {
const cred = String(args[0] ?? "");
const teamId = String(args[1] ?? "");
const channelId = String(args[2] ?? "");
const messageId = String(args[3] ?? "");
const reply = args[4];
if (!teamId || !channelId || !messageId) {
return errorReturn("teamId, channelId, and messageId are required.", "validation_failed");
}
const body = buildMessageBody(reply);
if (isErrorReturn(body))
return body;
return (await call(cred, "POST", `teams/${encodeURIComponent(teamId)}/channels/${encodeURIComponent(channelId)}/messages/${encodeURIComponent(messageId)}/replies`, body));
};
// ── Handlers — Chats ───────────────────────────────────────────────────
const listChats = async (args) => {
const cred = String(args[0] ?? "");
const opts = args[1] && typeof args[1] === "object" && !Array.isArray(args[1])
? args[1]
: {};
const resolved = await resolveCredential(cred);
if (isErrorReturn(resolved))
return resolved;
const path = resolved.user === ""
? "me/chats"
: `users/${encodeURIComponent(resolved.user)}/chats`;
const suffix = odataSuffix(opts);
return (await callWithToken(resolved, "GET", path + suffix, null, {}));
};
const sendChat = async (args) => {
const cred = String(args[0] ?? "");
const chatId = String(args[1] ?? "");
const message = args[2];
if (!chatId) {
return errorReturn("chatId is required.", "validation_failed");
}
const body = buildMessageBody(message);
if (isErrorReturn(body))
return body;
return (await call(cred, "POST", `chats/${encodeURIComponent(chatId)}/messages`, body));
};
// ── Handlers — Webhook (no Graph) ──────────────────────────────────────
/**
* Post to an Incoming Webhook URL. This bypasses Graph and the credential
* vault — the URL itself is the auth. Accepts:
* - A plain string message (wrapped as Microsoft Teams MessageCard text)
* - An object payload passed through as-is (Adaptive Card / custom JSON)
*/
const sendWebhook = async (args) => {
const webhookUrl = String(args[0] ?? "");
const message = args[1];
const opts = args[2] && typeof args[2] === "object" && !Array.isArray(args[2])
? args[2]
: {};
if (!webhookUrl) {
return errorReturn("webhookUrl is required.", "validation_failed");
}
let payload;
if (message && typeof message === "object" && !Array.isArray(message)) {
payload = { ...message };
}
else if (typeof message === "string") {
payload = { text: message };
}
else {
return errorReturn("message is required (string or object).", "validation_failed");
}
if (opts.title && payload.title === undefined)
payload.title = String(opts.title);
if (opts.themeColor && payload.themeColor === undefined)
payload.themeColor = String(opts.themeColor);
if (opts.sections && payload.sections === undefined)
payload.sections = opts.sections;
let response;
try {
response = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const status = response.status;
const text = await response.text();
if (status < 200 || status >= 300) {
return errorReturn(`Webhook returned HTTP ${status}: ${text || "(empty body)"}`, "webhook_error", { status });
}
return { ok: true, status, response: text || null };
};
// ── Exports: functions map ─────────────────────────────────────────────
export const TeamsFunctions = {
listTeams,
listChannels,
createChannel,
sendChannel,
getMessages,
replyToMessage,
listChats,
sendChat,
sendWebhook,
};
// ── Credential types ───────────────────────────────────────────────────
export const TeamsCredentialTypes = [
{
slug: CREDENTIAL_TYPE,
title: "Microsoft Graph",
icon: "message-circle",
description: "Credentials for Microsoft Graph API (Teams, Outlook, OneDrive, etc.). Note that several Teams endpoints are 'protected APIs' requiring Microsoft-gated admin approval — see https://learn.microsoft.com/en-us/graph/teams-protected-apis.",
fields: [
{
name: "auth_mode",
title: "Authentication mode",
type: "text",
required: true,
placeholder: "access_token",
description: "Choose how this credential authenticates:\n • access_token — Paste an OAuth2 access token obtained externally (delegated user auth).\n • client_credentials — Azure AD app-only auth. Provide client_id + client_secret + tenant_id + default_user.",
},
{
name: "access_token",
title: "Access token",
type: "password",
required: false,
placeholder: "eyJ0eXAiOiJKV1QiLCJhbGciOi…",
description: "OAuth2 Bearer token for the signed-in Microsoft 365 user. Required when auth_mode = access_token. Tokens expire after ~1 hour — supply refresh_token + client_id + client_secret + tenant_id for automatic rotation.",
},
{
name: "refresh_token",
title: "Refresh token",
type: "password",
required: false,
placeholder: "M.C508_BAY.0.U.-C…",
description: "Optional. When present alongside client_id + client_secret + tenant_id, the module will exchange it for a fresh access_token once the current one expires.",
},
{
name: "client_id",
title: "Azure AD application (client) ID",
type: "text",
required: false,
placeholder: "12345678-1234-1234-1234-1234567890ab",
description: "Optional for access_token mode (needed for refresh). **Required** for client_credentials mode.",
},
{
name: "client_secret",
title: "Client secret",
type: "password",
required: false,
placeholder: "abc~DEF.ghiJKL_mnoPQR…",
description: "Optional for access_token mode (needed for refresh). **Required** for client_credentials mode.",
},
{
name: "tenant_id",
title: "Tenant ID",
type: "text",
required: false,
placeholder: "contoso.onmicrosoft.com OR 12345678-1234-1234-1234-1234567890ab",
description: "Azure AD tenant — GUID, verified domain, or one of `common` / `organizations` / `consumers`. Required for refresh-token flow and client_credentials mode.",
},
{
name: "default_user",
title: "Default user (UPN or object ID)",
type: "text",
required: false,
placeholder: "user@company.onmicrosoft.com",
description: "Required for client_credentials mode. The user whose `/joinedTeams` and `/chats` are enumerated. Ignored in access_token mode.",
},
],
},
];
// ── Metadata: parameters + errors ──────────────────────────────────────
const credentialParam = {
name: "credential",
title: "Credential",
description: "Slug of a saved `microsoft_graph` credential.",
dataType: "string",
formInputType: "resource",
required: true,
allowExpression: true,
placeholder: "my_teams",
resource: {
type: "credential",
listFn: "credential.list",
modes: ["list", "expression"],
searchable: true,
filter: { type: CREDENTIAL_TYPE },
},
};
const teamIdParam = {
name: "teamId",
title: "Team ID",
description: "Team's Graph ID (GUID). Returned by `listTeams` or visible in the Teams admin center URL.",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "19:abc123…@thread.skype",
};
const channelIdParam = {
name: "channelId",
title: "Channel ID",
description: "Channel ID inside a team. Returned by `listChannels`.",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "19:channel-id@thread.tacv2",
};
const chatIdParam = {
name: "chatId",
title: "Chat ID",
description: "1:1 or group chat ID. Returned by `listChats`.",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "19:abc…@unq.gbl.spaces",
};
const messageParam = {
name: "message",
title: "Message",
description: "Plain string (wrapped as HTML `body`) or a `{content, contentType?, subject?, importance?, mentions?, attachments?}` object.",
dataType: "object",
formInputType: "textarea",
required: true,
allowExpression: true,
rows: 4,
placeholder: "<b>Hello team!</b>",
};
const commonErrors = {
credential_not_found: "No credential with that slug exists in the vault.",
token_missing: "Credential has no `access_token`, and not enough info to refresh or exchange for one.",
token_exchange_failed: "Microsoft identity platform rejected the token request.",
transport: "Network failure calling Microsoft Graph.",
graph_error: "Microsoft Graph returned an error — see `graph_error.error` for the `code` and `message`.",
permission_denied: "Access token lacks the required scope. Several Teams endpoints require gated admin approval (protected APIs).",
rate_limited: "Microsoft Graph rate-limit hit (HTTP 429) — retry after `retry_after` seconds.",
not_found: "Requested team / channel / chat / message does not exist.",
validation_failed: "Request body / query failed validation — see `graph_error` for details.",
webhook_error: "Incoming Webhook target returned a non-2xx response.",
};
// ── Function metadata ──────────────────────────────────────────────────
export const TeamsFunctionMetadata = {
listTeams: {
title: "List joined teams",
summary: "List every team the authenticated user belongs to",
description: "Calls `GET /me/joinedTeams` (delegated) or `GET /users/{default_user}/joinedTeams` (app-only). Returns `{id, displayName, description, isArchived, webUrl}` for each team.",
group: "teams",
action: "query",
icon: "users",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["teams", "list"],
parameters: [credentialParam],
returnType: "object",
returnDescription: "{ value: [Team, …] }",
errors: commonErrors,
example: 'teams.listTeams "my_teams"',
},
listChannels: {
title: "List channels in a team",
summary: "Enumerate a team's standard/private/shared channels",
description: "Calls `GET /teams/{teamId}/channels`. Returns channel metadata (id, displayName, membershipType, webUrl, filesFolderWebUrl).",
group: "teams",
action: "query",
icon: "list",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["teams", "channels", "list"],
parameters: [
credentialParam,
teamIdParam,
{
name: "options",
title: "OData options",
description: "Recognized keys: `$filter`, `$select`, `$top`.",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 2,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ value: [Channel, …] }",
errors: commonErrors,
example: 'teams.listChannels "my_teams" "19:…@thread.skype"',
},
createChannel: {
title: "Create channel",
summary: "Create a new channel in a team",
description: "Calls `POST /teams/{teamId}/channels`. `membershipType` is `standard` (default), `private`, or `shared`. Optionally supply a `description`.",
group: "teams",
action: "create",
icon: "plus-square",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: false,
since: "1.0.0",
tags: ["teams", "channel", "create"],
parameters: [
credentialParam,
teamIdParam,
{
name: "displayName",
title: "Display name",
description: "Channel name (visible in Teams UI).",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
},
{
name: "options",
title: "Options",
description: "Recognized keys:\n description : string\n membershipType : 'standard' (default) | 'private' | 'shared'",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 3,
},
],
returnType: "object",
returnDescription: "Created Channel resource.",
errors: commonErrors,
example: 'teams.createChannel "my_teams" "19:…@thread.skype" "Project Aurora" {membershipType:"private"}',
},
sendChannel: {
title: "Send channel message",
summary: "Post a new message to a channel",
description: "Calls `POST /teams/{teamId}/channels/{channelId}/messages`. Supply the message as a string (wrapped as HTML body) or a `{content, contentType?, subject?, importance?, mentions?, attachments?}` object.",
group: "messages",
action: "write",
icon: "send",
capability: "manage_options",
sideEffects: ["makes_http_call", "sends_notification"],
idempotent: false,
since: "1.0.0",
tags: ["teams", "channel", "message", "send"],
parameters: [credentialParam, teamIdParam, channelIdParam, messageParam],
returnType: "object",
returnDescription: "Created ChatMessage resource.",
errors: commonErrors,
examples: [
{
title: "Simple HTML message",
code: 'teams.sendChannel "my_teams" "{{ team.id }}" "{{ channel.id }}" "<b>Build succeeded</b>"',
},
{
title: "Message with subject + high importance",
code: 'teams.sendChannel "my_teams" "{{ team.id }}" "{{ channel.id }}" {content:"<p>Incident update</p>", subject:"P1 Incident", importance:"high"}',
},
],
example: 'teams.sendChannel "my_teams" "19:team…" "19:channel…" "Hello team!"',
},
getMessages: {
title: "List channel messages",
summary: "Read messages from a channel (newest first)",
description: "Calls `GET /teams/{teamId}/channels/{channelId}/messages`. For back-compat the module accepts `{top: N}` as shorthand for `{$top: N}`.",
group: "messages",
action: "query",
icon: "message-square",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["teams", "channel", "messages", "read"],
parameters: [
credentialParam,
teamIdParam,
channelIdParam,
{
name: "options",
title: "Options",
description: "Recognized keys:\n top / $top : number of messages to return\n $filter : OData filter\n $orderby : OData order",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 3,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ value: [ChatMessage, …] }",
errors: commonErrors,
example: 'teams.getMessages "my_teams" "19:team…" "19:channel…" {top:20}',
},
replyToMessage: {
title: "Reply to channel message",
summary: "Post a reply inside an existing channel conversation",
description: "Calls `POST /teams/{teamId}/channels/{channelId}/messages/{messageId}/replies`. Same message shape as `sendChannel`.",
group: "messages",
action: "write",
icon: "reply",
capability: "manage_options",
sideEffects: ["makes_http_call", "sends_notification"],
idempotent: false,
since: "1.0.0",
tags: ["teams", "channel", "reply"],
parameters: [
credentialParam,
teamIdParam,
channelIdParam,
{
name: "messageId",
title: "Parent message ID",
description: "ID of the channel message to reply to.",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
},
messageParam,
],
returnType: "object",
returnDescription: "Created reply ChatMessage.",
errors: commonErrors,
example: 'teams.replyToMessage "my_teams" "19:team…" "19:channel…" "1700000000000" "Thanks!"',
},
listChats: {
title: "List chats",
summary: "List 1:1 and group chats the user is in",
description: "Calls `GET /me/chats` (delegated) or `GET /users/{default_user}/chats` (app-only). Returns `{id, topic?, chatType, members?, webUrl}` for each chat.",
group: "chats",
action: "query",
icon: "messages-square",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["teams", "chats", "list"],
parameters: [
credentialParam,
{
name: "options",
title: "OData options",
description: "Recognized keys: `$filter`, `$top`, `$expand`.",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 2,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ value: [Chat, …] }",
errors: commonErrors,
example: 'teams.listChats "my_teams"',
},
sendChat: {
title: "Send chat message",
summary: "Post a message in a 1:1 or group chat",
description: "Calls `POST /chats/{chatId}/messages`. Same message shape as `sendChannel`.",
group: "chats",
action: "write",
icon: "send",
capability: "manage_options",
sideEffects: ["makes_http_call", "sends_notification"],
idempotent: false,
since: "1.0.0",
tags: ["teams", "chat", "message", "send"],
parameters: [credentialParam, chatIdParam, messageParam],
returnType: "object",
returnDescription: "Created ChatMessage.",
errors: commonErrors,
example: 'teams.sendChat "my_teams" "19:…@unq.gbl.spaces" "Hey there!"',
},
sendWebhook: {
title: "Send incoming-webhook message",
summary: "Post to a Teams Incoming Webhook URL (no credential required)",
description: "Posts a MessageCard / Adaptive Card payload to an Incoming Webhook (or Workflow HTTP webhook). The first argument is **the webhook URL**, not a credential slug — this endpoint authenticates via the URL itself. Accepts a plain string (wrapped as `{text}`) or a full payload object (passed through as-is).",
group: "chats",
action: "write",
icon: "webhook",
capability: "manage_options",
sideEffects: ["makes_http_call", "sends_notification"],
idempotent: false,
since: "1.0.0",
tags: ["teams", "webhook", "notification"],
parameters: [
{
name: "webhookUrl",
title: "Webhook URL",
description: "Full Incoming Webhook or Workflow HTTP webhook URL (stored by the caller).",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "https://outlook.office.com/webhook/GUID/IncomingWebhook/...",
},
{
name: "message",
title: "Message",
description: "Plain string (wrapped as MessageCard text) or a full `{title?, text?, themeColor?, sections?, attachments?}` payload (passed through as-is).",
dataType: "object",
formInputType: "textarea",
required: true,
allowExpression: true,
rows: 4,
},
{
name: "options",
title: "Options",
description: "Merged into the payload when not present:\n title : card title\n themeColor : hex (e.g. 'FF0000')\n sections : array of MessageCard sections",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 4,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ ok: true, status, response }",
errors: commonErrors,
example: 'teams.sendWebhook "https://outlook.office.com/webhook/…" "Build passed!" {title:"CI", themeColor:"00FF00"}',
},
};
// ── Module metadata ────────────────────────────────────────────────────
export const TeamsModuleMetadata = {
slug: "teams",
title: "Microsoft Teams",
summary: "Send messages, list teams/channels/chats, create channels, and post via Incoming Webhooks",
description: 'Programmatic access to Microsoft Teams via **Microsoft Graph** (+ Incoming Webhooks bypass). One module covers:\n\n • **Teams / channels** — list joined teams, enumerate channels, create new channels (standard / private / shared).\n • **Channel messages** — post messages, reply in threads, list history.\n • **Chats** — list 1:1 and group chats, send DMs.\n • **Webhooks** — post to Incoming Webhook / Workflow HTTP webhook URLs without any credential.\n\n**Auth** — reuses the `microsoft_graph` credential (same as Outlook, OneDrive). Several Teams endpoints are "protected APIs" (channel messages, chats) that require Microsoft-gated admin approval in addition to the standard Azure AD permissions. See https://learn.microsoft.com/en-us/graph/teams-protected-apis.',
category: "messaging",
icon: "icon.svg",
color: "#464EB8",
version: "0.2.0",
docsUrl: "https://docs.robinpath.com/modules/teams",
status: "stable",
requires: [],
minNodeVersion: "18.0.0",
credentialsType: CREDENTIAL_TYPE,
operationGroups: {
teams: {
title: "Teams / Channels",
description: "List teams, enumerate channels, create channels.",
order: 1,
},
messages: {
title: "Channel messages",
description: "Send, reply to, and list channel messages.",
order: 2,
},
chats: {
title: "Chats / Webhooks",
description: "1:1 + group chats, and webhook notifications.",
order: 3,
},
},
methods: Object.keys(TeamsFunctions),
};
//# sourceMappingURL=teams.js.map
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../src/teams.ts"],"names":[],"mappings":"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"}
+25
-9
{
"name": "@robinpath/teams",
"version": "0.1.1",
"version": "0.3.0",
"publishConfig": {

@@ -23,12 +23,22 @@ "access": "public"

"peerDependencies": {
"@robinpath/core": ">=0.20.0"
"@robinpath/core": ">=0.40.0"
},
"devDependencies": {
"@robinpath/core": "^0.30.1",
"@robinpath/core": "^0.40.0",
"typescript": "^5.6.0"
},
"description": "Teams module for RobinPath.",
"description": "Microsoft Teams integration via Microsoft Graph API — list joined teams, enumerate/create channels, send channel messages with replies, list and message 1:1/group chats, and post to Incoming Webhooks. Supports delegated OAuth2 access tokens (with refresh-token rotation) and Azure AD client-credentials.",
"keywords": [
"teams",
"messaging"
"messaging",
"microsoft",
"microsoft-365",
"office365",
"graph",
"microsoft-graph",
"chat",
"webhook",
"oauth2",
"azure-ad",
"client-credentials"
],

@@ -38,7 +48,13 @@ "license": "MIT",

"category": "messaging",
"type": "integration",
"auth": "bearer-token",
"functionCount": 10,
"baseUrl": "https://graph.microsoft.com"
"type": "module",
"auth": "credential-vault",
"functionCount": 9,
"baseUrl": "https://graph.microsoft.com",
"language": "nodejs",
"platforms": [
"cloud",
"cli",
"desktop"
]
}
}

@@ -22,3 +22,3 @@ # @robinpath/teams

```bash
npm install @robinpath/teams
robinpath add @robinpath/teams
```

@@ -25,0 +25,0 @@