{"_id":"@bachstudio/teams-card-mcp","_rev":"10-ac68e25c9e1a866a93ccdf4380521a41","name":"@bachstudio/teams-card-mcp","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@bachstudio/teams-card-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","power-automate","logic-apps","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.1.0","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"808e2e0cbcc7a821c9e1a8590897241ce00621dd","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.1.0.tgz","fileCount":21,"integrity":"sha512-mi1aiN3dU1YZEi31zY70xCidcjG+D1w3N4QVKJ14DjUHlnuQwFx6JM1bsnOC9uGZOFYmuFie4gh9YUmJuFaVsQ==","signatures":[{"sig":"MEUCIQDh58b4Vg9RdxNzr+wqUJ4b2nCTyk2VBIC5WUrC978VWgIgSwjzDRaieF8xwdiIlahUwB114SIoSwTgPyeV2BPhvzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82822},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","build":"tsc -p tsconfig.json","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"MCP server that sends interactive Microsoft Teams Adaptive Cards to a specific user via Power Automate and returns the user's click/form response to the calling agent.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.1.0_1785820298289_0.6095414892372641","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bachstudio/teams-card-mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.2.0","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"99748a00ed87694a4ddd429207e5246eea341e36","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.2.0.tgz","fileCount":18,"integrity":"sha512-qmwg6luNeqz7fGQX4RY/og1/eCcCIQGjM1oS1IrRFDu2Ps+cSYzp/zsNnkuXTwXzqCgCiqR9t6TlvlrooQz+nA==","signatures":[{"sig":"MEUCIQC7uyvK3lQmhJLtKWn3ME6tLTAQon43GXiAZX98V9kd5wIga8P1FRKAsNDTq18yhNUSsH5+Dx6LeJH1VpOx3AyUaXQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59771},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.2.0_1785822507986_0.49247922363508256","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bachstudio/teams-card-mcp","version":"0.2.1","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.2.1","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"c969371e5d51c7c630088892dbdb8066ceb883a3","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.2.1.tgz","fileCount":20,"integrity":"sha512-kNkdXYDeiI5/6W4et05NYkIRvAvgzoyUflS3RfdfT7ng9eFjRGW4HB/lQvViwlBwAh2A9PWNfwJhIQzbcqhglw==","signatures":[{"sig":"MEUCIFRZIakxex+IawX+k4gQGgA/iMuSmmmIGScuiaD5ppqEAiEAuTUKcPskySUMaRUGKNreq0PN3yVvjL7RtZ9NxOnHvRU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63434},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.2.1_1785823348061_0.8571406403448056","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bachstudio/teams-card-mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.3.0","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"827d1cc567391d8ed33505a6ad9aa458ace4d0e8","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.3.0.tgz","fileCount":22,"integrity":"sha512-KlWrhTeePYadsLATUrgRdlEhAruDxgtxfq/BaGLfk6ZKIntSVOmPYKswvd39QR2f4OWrGIM8IktBQN0Zgv4/IQ==","signatures":[{"sig":"MEQCICP0WI2M0rStFh2e772GvAZHBu/f/c+42u4WxYyEGy96AiBegYn4YdnucbZ3GCiWtGOOTEh/FSxPPleTtkiD8FaqyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67786},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.3.0_1785824328227_0.17780958784386414","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bachstudio/teams-card-mcp","version":"0.3.1","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.3.1","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"af091c8df44a14bf86ca1dbb583f6447018e7c56","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.3.1.tgz","fileCount":22,"integrity":"sha512-unQBUB11uyAF2MuheLnJrLuLJXfwbdxJGy2Ubu9W2EkJVJrZB+375s/ps2n1s38K/dcJYXAN18gfcz6U1sPLPQ==","signatures":[{"sig":"MEUCIBZ4PP/J6stFBWx/rOjxwrsf9vKFuWSghdDuYBwOcXu6AiEA+HdrVFqcrfHZcT/vSdZtD/7enk72xDe4+aQqiEVjgYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69737},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.3.1_1785825263647_0.6828614504791501","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bachstudio/teams-card-mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.4.0","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"55bc373d8927d7ce3b9886db35ee5952c1f4153b","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.4.0.tgz","fileCount":22,"integrity":"sha512-/ee7GMtHgjjCNMK6o/unhcik49Hejg++rZHYGmm/BEVPeoQEEXhY9GBz+fACcyt8Ab6prv1cPSm9UZ5bkKvzNQ==","signatures":[{"sig":"MEUCIQCOrNvefYabeA4yAN9yRFW7ABoGq8VJg2uCi4/NdJg2KwIgMjtSQPIgaHik4wRSVk7LTMiPn5sUxruinZGj9rMT9eM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70527},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.4.0_1785826564708_0.1435382829338454","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@bachstudio/teams-card-mcp","version":"0.4.1","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.4.1","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"c6ee651be43699369b90864cf2f7b971ff616c75","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.4.1.tgz","fileCount":22,"integrity":"sha512-G/gsWnAJEs3dTMGAvx2W1jfpHuntYwM6yi8lqWBhYRm+Dqntm9yB4QqOjyQCcUQGqyrfYO5/fZ2TwW+8JdMJ3g==","signatures":[{"sig":"MEQCIENwmw3pjCPoJjcBB9RHEXM8etSLKFQ4ASJCsGhot0kpAiBDtgvgdXAmyRHWZPriVcUCrawT2nZPwyGHkeF+McsKsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69990},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.4.1_1785826596573_0.5206855339934668","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@bachstudio/teams-card-mcp","version":"0.4.2","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.4.2","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"d7e6dff9b8feed186c88e02566000e7bd52ef595","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.4.2.tgz","fileCount":22,"integrity":"sha512-l+aYJGjIAH1BxVDqIQLsssZv8yAfRNmgrzaxydIJvY6cXC0/iKaYIty6P0fbay2WFnSdXktGWQDRYyXVdAxjtA==","signatures":[{"sig":"MEYCIQDNYNkkfzpYteuJ3hX2EGRVuzEVeUf45YmD6wuUNoKq2gIhAP7gOFl8Pobyqck5eKr3lDOxnmrGzRodvspHZEpVaNUP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71413},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.8.2","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.4.2_1785827232364_0.7908903303490906","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bachstudio/teams-card-mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"author":{"name":"bachstudio"},"license":"MIT","_id":"@bachstudio/teams-card-mcp@0.5.0","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"bin":{"teams-card-mcp":"dist/index.js"},"dist":{"shasum":"383f9dd975f6fc097d4af95421f63f8a221ea409","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.5.0.tgz","fileCount":22,"integrity":"sha512-29jGC2mixoiW4zWYmc1Od+PMQbNg+1cHvb6PJCk5lYN56e+pPs3+qf/YKTJGUQ6XMoEacVO6Y74Y0kDDf2xwqw==","signatures":[{"sig":"MEYCIQDX9hlaS3o4YCmGgT280+LloKrZJLmroHk0d+aP67Y7VQIhALBjkEpLU0jRmyC/3/L3RsykYa+LiX1zJjq7rQSHoBZ3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72670},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"564cf8c7c3b047557b4673b1db6c6b0660834c31","scripts":{"dev":"tsx watch src/index.ts","build":"npm run clean && tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke":"tsx test/smoke.ts","start":"node dist/index.js","typecheck":"tsc -p tsconfig.json --noEmit","smoke:stdio":"npm run build && tsx test/stdio.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"_npmVersion":"10.9.4","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.25.76","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.5","typescript":"^7.0.2","@types/node":"^26.1.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/teams-card-mcp_0.5.0_1785901709281_0.37193744425920006","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bachstudio/teams-card-mcp","version":"0.6.0","description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","author":{"name":"bachstudio"},"license":"MIT","type":"module","main":"dist/index.js","bin":{"teams-card-mcp":"dist/index.js"},"keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"publishConfig":{"access":"public"},"scripts":{"build":"npm run clean && tsc -p tsconfig.json","start":"node dist/index.js","dev":"tsx watch src/index.ts","smoke":"tsx test/smoke.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","smoke:stdio":"npm run build && tsx test/stdio.ts"},"engines":{"node":">=18"},"dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","express":"^5.2.1","zod":"^3.25.76"},"devDependencies":{"@types/express":"^5.0.6","@types/node":"^26.1.2","tsx":"^4.23.5","typescript":"^7.0.2"},"_id":"@bachstudio/teams-card-mcp@0.6.0","gitHead":"564cf8c7c3b047557b4673b1db6c6b0660834c31","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-Ao0fczE8PntwrHKR1yWTkC+DOei8d5lJ4KY1dZtvf8LNB1hkGU8UjrGQSzHAMOhGt/E+JQKxI4ek/cDhi+OifA==","shasum":"2dd26c95cad0542c2f12f987be4b78c45d788aaf","tarball":"https://registry.npmjs.org/@bachstudio/teams-card-mcp/-/teams-card-mcp-0.6.0.tgz","fileCount":22,"unpackedSize":76600,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICzndRfIBXZfi3osMCqbgm9ni3CeG16TbIH/8AllSyO1AiEAiCrVGmUwKANdvy1ZoDgTxZvu5JcZj6ZYNmPrbERkHIo="}]},"_npmUser":{"name":"bachstudio","email":"bach_mcp_studio@bach.team"},"directories":{},"maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/teams-card-mcp_0.6.0_1785921943048_0.26028757741899833"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-04T05:11:38.067Z","modified":"2026-08-05T09:25:43.393Z","0.1.0":"2026-08-04T05:11:38.423Z","0.2.0":"2026-08-04T05:48:28.128Z","0.2.1":"2026-08-04T06:02:28.204Z","0.3.0":"2026-08-04T06:18:48.359Z","0.3.1":"2026-08-04T06:34:23.784Z","0.4.0":"2026-08-04T06:56:04.841Z","0.4.1":"2026-08-04T06:56:36.711Z","0.4.2":"2026-08-04T07:07:12.514Z","0.5.0":"2026-08-05T03:48:29.422Z","0.6.0":"2026-08-05T09:25:43.217Z"},"author":{"name":"bachstudio"},"license":"MIT","keywords":["mcp","model-context-protocol","microsoft-teams","adaptive-cards","bot-framework","agent","bach"],"description":"Standalone MCP server: lets an agent send Microsoft Teams messages and Adaptive Cards to a specific user via its own configured bot. Outbound-only, no public endpoint required.","maintainers":[{"name":"bachstudio","email":"bach_mcp_studio@bach.team"}],"readme":"# teams-card-mcp\n\n一个独立的 MCP 服务：**agent 绑定它，就能用它自己配置的 Teams bot 给指定用户发消息和卡片。**\n\n```\nbach agent ──MCP──> teams-card-mcp ──出站 HTTPS──> Bot Framework ──> Teams 用户\n                    （自带 bot 凭据，不依赖任何其他服务）\n```\n\n不需要公网入口、不需要 Power Automate、不需要 Webhook——发消息是纯出站调用。\n\n## 配置\n\n**服务不需要任何环境变量就能启动并列出工具。** 缺凭据时工具照常列出，\n只有真正调用才会返回一条写明缺什么、怎么补的说明。这样网关永远不会因为配置没送到\n而拿到一个\"查不出任何工具\"的空壳。\n\n要真正能发消息，需要三个值：\n\n| 变量 | 说明 |\n|---|---|\n| `BOT_APP_ID` | Microsoft App ID / Bot ID |\n| `BOT_APP_PASSWORD` | Microsoft App Password / Client Secret |\n| `BOT_TENANT_ID` | Microsoft Entra Tenant ID |\n\n在 bach 后台配过「外部机器人 → Microsoft Teams」的话，这三个就是那里的\n`appId` / `appPassword` / `tenantId`，直接抄过来（也可以用另一个完全独立的 bot——\n本服务不调用 bach 的机器人服务）。\n\n### 放进 MCP 启动配置（推荐）\n\n```json\n{\n  \"mcpServers\": {\n    \"teams\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bachstudio/teams-card-mcp\", \"--stdio\"],\n      \"env\": {\n        \"BOT_APP_ID\": \"...\",\n        \"BOT_APP_PASSWORD\": \"...\",\n        \"BOT_TENANT_ID\": \"...\"\n      }\n    }\n  }\n}\n```\n\n### 其它放法\n\n也支持 `.env` 文件（放启动目录自动加载）、`ENV_FILE=/path/to/file` 指定路径、\nsystemd 的 `EnvironmentFile=`、Docker 的 `env_file:`、K8s 的 `env` / Secret。\n优先级：**已存在的环境变量 > `.env` 文件**。\n\n其余可选项见 `env.example`。\n\n## 两种传输方式\n\n| 方式 | 怎么启动 | 用在哪 |\n|---|---|---|\n| **http**（默认） | `npx -y @bachstudio/teams-card-mcp` | bach 用 `HttpClientTransport` 直连 `/mcp` |\n| **stdio** | `npx -y @bachstudio/teams-card-mcp --stdio` | supergateway 等 stdio→SSE 网关托管 |\n\n也可以用 `MCP_TRANSPORT=stdio` 代替 `--stdio`。\n\n> stdio 模式下 stdout 完全属于 MCP 协议，本服务所有日志都写 stderr，不会污染协议流。\n\n### supergateway 托管示例\n\n```bash\nsupergateway --stdio \"npx -y @bachstudio/teams-card-mcp@0.6.0 --stdio\" --port 8000\n```\n\n**环境变量不要写在 stdio 命令串里**——那是一段交给 `/bin/sh` 解析的字符串，容易出问题\n（比如变量名里混进一个肉眼看不出来的非 ASCII 字符，shell 就会把整串当命令执行，\n报 `not found` 且 exit 127，网关侧表现成「连上了但查不到工具」）。\n\n改成在容器/Pod 层面注入，子进程自然继承：\n\n```yaml\n# K8s Deployment\nenv:\n  - name: BOT_APP_ID\n    valueFrom: { secretKeyRef: { name: teams-bot, key: appId } }\n  - name: BOT_APP_PASSWORD\n    valueFrom: { secretKeyRef: { name: teams-bot, key: appPassword } }\n  - name: BOT_TENANT_ID\n    valueFrom: { secretKeyRef: { name: teams-bot, key: tenantId } }\n```\n\n## 跑起来\n\n```bash\nnpm install && npm run build\nBOT_APP_ID=xxx BOT_APP_PASSWORD=yyy BOT_TENANT_ID=zzz npm start\n```\n\n启动时会自动换一次 token 验证凭据，凭据错了立刻在日志里告警，不用等到第一次发消息。\n\n不接真实 Teams 也能验证整条调用链（内置假的 Entra / Bot Framework / Graph）：\n\n```bash\nnpm run smoke\n```\n\n## MCP 工具\n\n| 工具 | 用途 |\n|---|---|\n| `teams_send_message` | 发纯文本私聊消息 |\n| `teams_send_notice` | 发一张只读信息卡片（标题 + 说明 + 键值对），适合构建结果、告警 |\n| `teams_ask` | 发一张带按钮的卡片（审批、确认、二选一） |\n| `teams_send_form` | 发一张带输入框的表单卡片 |\n| `teams_send_raw_card` | 发调用方自己构造的完整 Adaptive Card |\n| `teams_resolve_user` | 邮箱 → Entra 对象 ID，用于确认用户存在 |\n\n### 收件人怎么填\n\n所有工具的 `user` 参数**由 agent 在调用时传入**，服务本身不维护任何用户名单。两种填法：\n\n| 填什么 | 需要什么权限 |\n|---|---|\n| 企业邮箱（`zhangsan@contoso.com`） | 应用注册需有 Graph `User.Read.All` 应用权限（管理员同意一次） |\n| Entra 对象 ID（`aadObjectId`） | 不需要额外权限 |\n\n没有 Graph 权限时用邮箱会返回明确报错并提示改用对象 ID，不会静默失败。\n\n### 调用示例\n\n```jsonc\n// 通知\n{ \"user\": \"zhangsan@contoso.com\", \"text\": \"**构建失败**\\n\\n分支 dev-master-v6，日志见附件\" }\n\n// 信息卡片\n{\n  \"user\": \"zhangsan@contoso.com\",\n  \"title\": \"构建失败\",\n  \"description\": \"流水线 #2841\",\n  \"facts\": { \"项目\": \"bach\", \"分支\": \"dev-master-v6\", \"耗时\": \"3m12s\" }\n}\n\n// 带按钮\n{\n  \"user\": \"zhangsan@contoso.com\",\n  \"question\": \"是否批准这笔报销？\",\n  \"facts\": { \"申请人\": \"张三\", \"金额\": \"5000 元\" },\n  \"options\": [\n    { \"id\": \"approve\", \"title\": \"同意\", \"style\": \"positive\" },\n    { \"id\": \"reject\",  \"title\": \"驳回\", \"style\": \"destructive\" }\n  ]\n}\n\n// 带跳转按钮：点了跳到指定 Teams 应用，并把自定义信息送到目标网页\n{\n  \"user\": \"zhangsan@contoso.com\",\n  \"question\": \"任务已就绪\",\n  \"options\": [\n    {\n      \"id\": \"open\",\n      \"title\": \"在 Bach 里查看\",\n      \"style\": \"positive\",\n      \"deep_link\": {\n        \"app_id\": \"8b9a2465-fc14-4e9f-b07b-791c8b0c4fd4\",\n        \"entity_id\": \"bach\",\n        \"data\": { \"conversationId\": \"abc-123\" }\n      }\n    }\n  ]\n}\n```\n\n> `deep_link` 让 MCP 自己拼出 `https://teams.microsoft.com/l/entity/{app_id}/{entity_id}?context=...` 深链。\n> `data` 会被序列化后放进 subEntityId，目标网页用 Teams JS SDK 读回：\n>\n> ```js\n> const ctx = await microsoftTeams.app.getContext();\n> const raw = ctx.page.subPageId;                       // MCP 送来的 subEntityId\n> const payload = JSON.parse(raw);                       // 若 data 是对象\n> // -> { conversationId: \"abc-123\" }\n> ```\n>\n> 也可以自己手拼 URL 走 `url` 字段（跳任意 https 网址）。`url` 和 `deep_link` **不能同时填**。\n\n## 前提条件\n\n1. **目标用户必须已安装这个 Teams 应用（个人范围）。** bot 只能给装过应用的用户发私聊，\n   没装会返回 403，服务会把这个原因原样说出来。\n2. bot 的**单租户 / 多租户**类型要和 `BOT_TENANT_TYPE` 一致，否则 token 拿得到但发送时 401。\n\n## 接入 bach\n\nbach 走远程 HTTP MCP（`Super.Agent.Core` 用 `McpClient` + `HttpClientTransport` 连 `plugin.api_url`），\n在 bach 后台注册成 MCP 插件即可：\n\n| 配置项 | 填什么 |\n|---|---|\n| `api_url` | `http(s)://你的服务地址/mcp` |\n| 认证头 | `x-api-key: <你的 MCP_API_KEY>`（没配 `MCP_API_KEY` 就不用带） |\n| `name_space` | 例如 `teams` |\n\n注意：bach 注册工具时会执行 `f.Name.Replace(\"-\",\"\")`，所以本服务所有工具名都用下划线，已规避。\n\n## 当前边界\n\n**这一版只做发送。** 用户点击卡片按钮后，Teams 会往**你的 bot 消息端点**发一条\n`text` 为空、`value` 带着按钮 data 的 message 活动——本服务不接收这个回传，\n需要由那个端点侧处理。卡片按钮的 `data.__action` 就是你在 `options[].id` 里填的值，\n端点侧凭它判断用户点了哪个。\n\n要让 agent 能同步拿到点击结果（`teams_ask` 发出去后直接等到答案），\n需要本服务额外提供 `/api/messages` 端点并接管 bot 的消息路由——那是下一步。\n\n## 项目结构\n\n```\nsrc/\n  loadEnv.ts       启动前加载 .env / ENV_FILE（必须先于 config 求值）\n  config.ts        环境变量读取与启动校验\n  logger.ts        分级日志\n  cards.ts         Adaptive Card 构造\n  botFramework.ts  token / 建会话 / 投递 activity，含 token+会话+用户 ID 三级缓存\n  tools.ts         6 个 MCP 工具\n  mcp.ts           McpServer 工厂（http / stdio 共用）\n  server.ts        Express：/mcp、/healthz、鉴权\n  index.ts         按 transport 分支启动、凭据自检、优雅退出\ntest/\n  smoke.ts         HTTP 传输端到端冒烟（内置假微软云）\n  stdio.ts         stdio 传输冒烟（复现 supergateway 托管方式）\n```\n","readmeFilename":"README.md"}