From dc9f5baf6aeddc50da9f1947c4011b16a987dabd Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 26 Jun 2026 16:26:08 -0700 Subject: [PATCH 1/2] Fix CLI template issues and remove AI/MCP/MCPClient templates Remove the ai, mcp, and mcpclient TypeScript templates (the mcp package.json contained invalid JSON and the ai AGENTS.md linked to a dead URL). Fix remaining templates: - graph (TS): declare missing @microsoft/teams.api dependency - tab (TS): declare missing @microsoft/teams-js and @microsoft/teams.common dependencies; rename leftover @tests/tab loggers; await reply() - graph (Python): fix possibly-unbound 'me'; align dotenv pin - python READMEs: drop nonexistent apppackage/ reference - update listTemplates mock in menu-loop test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/cli/templates/python/echo/README.md | 1 - packages/cli/templates/python/graph/README.md | 1 - .../templates/python/graph/pyproject.toml.hbs | 2 +- .../cli/templates/python/graph/src/main.py | 1 + .../cli/templates/typescript/ai/AGENTS.md | 30 ----------- .../templates/typescript/ai/package.json.hbs | 31 ----------- .../cli/templates/typescript/ai/src/index.ts | 25 --------- .../cli/templates/typescript/ai/tsconfig.json | 23 -------- .../templates/typescript/ai/tsup.config.js | 13 ----- .../typescript/graph/package.json.hbs | 1 + .../templates/typescript/mcp/package.json.hbs | 35 ------------ .../templates/typescript/mcp/src/index.ts.hbs | 30 ----------- .../templates/typescript/mcp/tsconfig.json | 23 -------- .../templates/typescript/mcp/tsup.config.js | 13 ----- .../typescript/mcpclient/package.json.hbs | 32 ----------- .../typescript/mcpclient/src/index.ts.hbs | 53 ------------------- .../typescript/mcpclient/tsconfig.json | 23 -------- .../typescript/mcpclient/tsup.config.js | 13 ----- .../templates/typescript/tab/package.json.hbs | 2 + .../templates/typescript/tab/src/Tab/App.tsx | 2 +- .../cli/templates/typescript/tab/src/index.ts | 4 +- packages/cli/tests/menu-loop.test.ts | 2 +- 22 files changed, 9 insertions(+), 351 deletions(-) delete mode 100644 packages/cli/templates/typescript/ai/AGENTS.md delete mode 100644 packages/cli/templates/typescript/ai/package.json.hbs delete mode 100644 packages/cli/templates/typescript/ai/src/index.ts delete mode 100644 packages/cli/templates/typescript/ai/tsconfig.json delete mode 100644 packages/cli/templates/typescript/ai/tsup.config.js delete mode 100644 packages/cli/templates/typescript/mcp/package.json.hbs delete mode 100644 packages/cli/templates/typescript/mcp/src/index.ts.hbs delete mode 100644 packages/cli/templates/typescript/mcp/tsconfig.json delete mode 100644 packages/cli/templates/typescript/mcp/tsup.config.js delete mode 100644 packages/cli/templates/typescript/mcpclient/package.json.hbs delete mode 100644 packages/cli/templates/typescript/mcpclient/src/index.ts.hbs delete mode 100644 packages/cli/templates/typescript/mcpclient/tsconfig.json delete mode 100644 packages/cli/templates/typescript/mcpclient/tsup.config.js diff --git a/packages/cli/templates/python/echo/README.md b/packages/cli/templates/python/echo/README.md index 341bccba0..608b06038 100644 --- a/packages/cli/templates/python/echo/README.md +++ b/packages/cli/templates/python/echo/README.md @@ -6,7 +6,6 @@ This is a minimal Microsoft Teams echo bot template using [microsoft-teams](http - `src/main.py`: Main application code for the Teams bot. - `pyproject.toml`: Project dependencies and metadata. -- `apppackage/`: Teams app manifest and related files. ## Getting Started diff --git a/packages/cli/templates/python/graph/README.md b/packages/cli/templates/python/graph/README.md index c090a6277..a9dbe26ab 100644 --- a/packages/cli/templates/python/graph/README.md +++ b/packages/cli/templates/python/graph/README.md @@ -6,7 +6,6 @@ This is a minimal Microsoft Teams graph bot template using [microsoft-teams](htt - `src/main.py`: Main application code for the Teams bot. - `pyproject.toml`: Project dependencies and metadata. -- `apppackage/`: Teams app manifest and related files. ## Getting Started diff --git a/packages/cli/templates/python/graph/pyproject.toml.hbs b/packages/cli/templates/python/graph/pyproject.toml.hbs index 6cabf67a6..9c276b4ae 100644 --- a/packages/cli/templates/python/graph/pyproject.toml.hbs +++ b/packages/cli/templates/python/graph/pyproject.toml.hbs @@ -7,7 +7,7 @@ requires-python = ">=3.12" dependencies = [ "microsoft-teams-apps", "microsoft-teams-graph", - "dotenv" + "dotenv>=0.9.9" ] [dependency-groups] diff --git a/packages/cli/templates/python/graph/src/main.py b/packages/cli/templates/python/graph/src/main.py index 8728de6f6..7062db5cf 100644 --- a/packages/cli/templates/python/graph/src/main.py +++ b/packages/cli/templates/python/graph/src/main.py @@ -37,6 +37,7 @@ async def handle_profile_command(ctx: ActivityContext[MessageActivity]): graph = ctx.user_graph # Fetch user profile + me = None if graph: me = await graph.me.get() diff --git a/packages/cli/templates/typescript/ai/AGENTS.md b/packages/cli/templates/typescript/ai/AGENTS.md deleted file mode 100644 index aae2a0d8d..000000000 --- a/packages/cli/templates/typescript/ai/AGENTS.md +++ /dev/null @@ -1,30 +0,0 @@ -# Agent Instructions for Teams SDK based agents - -This is a Microsoft Teams bot project built with the new Teams SDK and OpenAI integration. - -IMPORTANT: To actually run this bot inside a real Microsoft Teams instance, fetch and follow the instructions in the linked AGENTS.md below (comprehensive development guidance, Azure setup instructions, and troubleshooting): - -https://raw.githubusercontent.com/microsoft/teams.ts/main/AGENTS_TEMPLATE.md - -## Project-Specific Notes - -- This bot uses **OpenAI GPT-4o** for chat completions -- Conversation history is stored via **LocalStorage** -- Run with `npm run dev` for local development - -## Quick Reference - -| Command | Description | -|---------|-------------| -| `npm install` | Install dependencies | -| `npm run dev` | Start development server with hot reload | -| `npm run build` | Build for production | - -## Environment Variables - -| Variable | Required | Description | -|----------|----------|-------------| -| `OPENAI_API_KEY` | Yes | OpenAI API key for GPT-4o | -| `CLIENT_ID` | Yes | Azure AD App Registration ID | -| `CLIENT_SECRET` | Yes | Azure AD App client secret | -| `TENANT_ID` | Yes | Azure AD Tenant ID | diff --git a/packages/cli/templates/typescript/ai/package.json.hbs b/packages/cli/templates/typescript/ai/package.json.hbs deleted file mode 100644 index 553e08175..000000000 --- a/packages/cli/templates/typescript/ai/package.json.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{ -"name": "{{ toKebabCase name }}", -"version": "0.0.0", -"license": "MIT", -"private": true, -"main": "dist/index", -"types": "dist/index", -"files": [ -"dist", -"README.md" -], -"scripts": { -"clean": "npx rimraf ./dist", -"build": "npx tsup", -"start": "node .", -"dev": "tsx watch -r dotenv/config src/index.ts" -}, -"dependencies": { -"@microsoft/teams.ai": "latest", -"@microsoft/teams.apps": "latest", -"@microsoft/teams.openai": "latest" -}, -"devDependencies": { -"@types/node": "^22.5.4", -"dotenv": "^16.4.5", -"rimraf": "^6.0.1", -"tsx": "^4.20.6", -"tsup": "^8.4.0", -"typescript": "^5.4.5" -} -} diff --git a/packages/cli/templates/typescript/ai/src/index.ts b/packages/cli/templates/typescript/ai/src/index.ts deleted file mode 100644 index 45fea4f6f..000000000 --- a/packages/cli/templates/typescript/ai/src/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { App } from '@microsoft/teams.apps'; -import { ChatPrompt, Message } from '@microsoft/teams.ai'; -import { LocalStorage } from '@microsoft/teams.common/storage'; -import { OpenAIChatModel } from '@microsoft/teams.openai'; - -const storage = new LocalStorage>(); -const app = new App({ - storage, -}); - -app.on('message', async ({ stream, activity }) => { - const prompt = new ChatPrompt({ - messages: storage.get(`${activity.conversation.id}/${activity.from.id}`), - model: new OpenAIChatModel({ - model: 'gpt-4o', - apiKey: process.env.OPENAI_API_KEY, - }), - }); - - await prompt.send(activity.text, { - onChunk: (chunk) => stream.emit(chunk), - }); -}); - -app.start(process.env.PORT || 3978).catch(console.error); diff --git a/packages/cli/templates/typescript/ai/tsconfig.json b/packages/cli/templates/typescript/ai/tsconfig.json deleted file mode 100644 index 2c188ac0d..000000000 --- a/packages/cli/templates/typescript/ai/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "module": "NodeNext", - "target": "ESNext", - "moduleResolution": "NodeNext", - "strict": true, - "noImplicitAny": true, - "declaration": true, - "inlineSourceMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": false, - "resolveJsonModule": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "pretty": true, - "outDir": "dist", - "rootDir": "src", - "types": ["node"] - } -} diff --git a/packages/cli/templates/typescript/ai/tsup.config.js b/packages/cli/templates/typescript/ai/tsup.config.js deleted file mode 100644 index 32277a72f..000000000 --- a/packages/cli/templates/typescript/ai/tsup.config.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import('tsup').Options} */ -module.exports = { - dts: true, - minify: false, - bundle: false, - sourcemap: true, - treeshake: true, - splitting: true, - clean: true, - outDir: 'dist', - entry: ['src/index.ts'], - format: ['cjs'], -}; diff --git a/packages/cli/templates/typescript/graph/package.json.hbs b/packages/cli/templates/typescript/graph/package.json.hbs index 4ffaf652a..ecc6d64f6 100644 --- a/packages/cli/templates/typescript/graph/package.json.hbs +++ b/packages/cli/templates/typescript/graph/package.json.hbs @@ -16,6 +16,7 @@ "dev": "tsx watch -r dotenv/config src/index.ts" }, "dependencies": { +"@microsoft/teams.api": "latest", "@microsoft/teams.apps": "latest", "@microsoft/teams.cards": "latest", "@microsoft/teams.graph-endpoints": "latest" diff --git a/packages/cli/templates/typescript/mcp/package.json.hbs b/packages/cli/templates/typescript/mcp/package.json.hbs deleted file mode 100644 index 2acb5da67..000000000 --- a/packages/cli/templates/typescript/mcp/package.json.hbs +++ /dev/null @@ -1,35 +0,0 @@ -{ -"name": "{{ toKebabCase name }}", -"version": "0.0.0", -"license": "MIT", -"private": true, -"main": "dist/index", -"types": "dist/index", -"files": [ -"dist", -"README.md" -], -"scripts": { -"clean": "npx rimraf ./dist", -"build": "npx tsc", -"start": "node .", -"dev": "tsx watch -r dotenv/config src/index.ts", -"inspect": "npx cross-env SERVER_PORT=9000 npx @modelcontextprotocol/inspector -e NODE_NO_WARNINGS=1 -e PORT=3978 node --r dotenv/config ." -}, -"dependencies": { -"@microsoft/teams.apps": "latest", -"@microsoft/teams.mcp": "latest", -"@microsoft/teams.openai": "latest", -"@modelcontextprotocol/sdk": "^1.25.2" -}, -"devDependencies": { -"@modelcontextprotocol/inspector": "^0.6.0", -"@types/node": "^22.5.4", -"cross-env": "^7.0.3", -"dotenv": "^16.4.5", -"rimraf": "^6.0.1", -"tsx": "^4.20.6", -"typescript": "^5.4.5" -} -} diff --git a/packages/cli/templates/typescript/mcp/src/index.ts.hbs b/packages/cli/templates/typescript/mcp/src/index.ts.hbs deleted file mode 100644 index f9721bff3..000000000 --- a/packages/cli/templates/typescript/mcp/src/index.ts.hbs +++ /dev/null @@ -1,30 +0,0 @@ -import { ChatPrompt } from '@microsoft/teams.ai'; -import { App } from '@microsoft/teams.apps'; -import { McpPlugin } from '@microsoft/teams.mcp'; -import { OpenAIChatModel } from '@microsoft/teams.openai'; - -const prompt = new ChatPrompt({ - model: new OpenAIChatModel({ - model: 'gpt-4o-mini', - apiKey: process.env.OPENAI_API_KEY, - }), -}); - -prompt.function('hello-world', 'print hello world', () => { - return 'hello world!'; -}); - -const app = new App({ - plugins: [ - new McpPlugin({ name: '{{ toKebabCase name }}' }).use(prompt) - ], -}); - -app.on('message', async ({ send, activity }) => { - await send({ type: 'typing' }); - await send(`you said "${activity.text}"`); -}); - -(async () => { - await app.start(); -})(); diff --git a/packages/cli/templates/typescript/mcp/tsconfig.json b/packages/cli/templates/typescript/mcp/tsconfig.json deleted file mode 100644 index 2c188ac0d..000000000 --- a/packages/cli/templates/typescript/mcp/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "module": "NodeNext", - "target": "ESNext", - "moduleResolution": "NodeNext", - "strict": true, - "noImplicitAny": true, - "declaration": true, - "inlineSourceMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": false, - "resolveJsonModule": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "pretty": true, - "outDir": "dist", - "rootDir": "src", - "types": ["node"] - } -} diff --git a/packages/cli/templates/typescript/mcp/tsup.config.js b/packages/cli/templates/typescript/mcp/tsup.config.js deleted file mode 100644 index 32277a72f..000000000 --- a/packages/cli/templates/typescript/mcp/tsup.config.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import('tsup').Options} */ -module.exports = { - dts: true, - minify: false, - bundle: false, - sourcemap: true, - treeshake: true, - splitting: true, - clean: true, - outDir: 'dist', - entry: ['src/index.ts'], - format: ['cjs'], -}; diff --git a/packages/cli/templates/typescript/mcpclient/package.json.hbs b/packages/cli/templates/typescript/mcpclient/package.json.hbs deleted file mode 100644 index bdc5946cc..000000000 --- a/packages/cli/templates/typescript/mcpclient/package.json.hbs +++ /dev/null @@ -1,32 +0,0 @@ -{ -"name": "{{ toKebabCase name }}", -"version": "0.0.0", -"license": "MIT", -"private": true, -"main": "dist/index", -"types": "dist/index", -"files": [ -"dist", -"README.md" -], -"scripts": { -"clean": "npx rimraf ./dist", -"build": "npx tsc", -"start": "node .", -"dev": "tsx watch -r dotenv/config src/index.ts" -}, -"dependencies": { -"@microsoft/teams.apps": "latest", -"@microsoft/teams.mcpclient": "latest", -"@microsoft/teams.openai": "latest", -"@modelcontextprotocol/sdk": "^1.25.2" -}, -"devDependencies": { -"@types/node": "^22.5.4", -"cross-env": "^7.0.3", -"dotenv": "^16.4.5", -"rimraf": "^6.0.1", -"tsx": "^4.20.6", -"typescript": "^5.4.5" -} -} diff --git a/packages/cli/templates/typescript/mcpclient/src/index.ts.hbs b/packages/cli/templates/typescript/mcpclient/src/index.ts.hbs deleted file mode 100644 index ddc427e15..000000000 --- a/packages/cli/templates/typescript/mcpclient/src/index.ts.hbs +++ /dev/null @@ -1,53 +0,0 @@ -import { ChatPrompt } from '@microsoft/teams.ai'; -import { App } from '@microsoft/teams.apps'; -import { McpClientPlugin } from "@microsoft/teams.mcpclient"; -import { OpenAIChatModel } from '@microsoft/teams.openai'; -import { ConsoleLogger } from '@microsoft/teams.common'; - -const logger = new ConsoleLogger('mcp-client', { level: 'debug' }); -const app = new App({ - plugins: [], - logger, -}); - -const prompt = new ChatPrompt( - { - instructions: - "You are a helpful assistant. You MUST use tool calls to do all your work.", - model: new OpenAIChatModel({ - apiKey: process.env.AZURE_OPENAI_API_KEY || process.env.OPENAI_API_KEY, - endpoint: process.env.AZURE_OPENAI_ENDPOINT, - apiVersion: process.env.AZURE_OPENAI_API_VERSION, - model: process.env.AZURE_OPENAI_MODEL_DEPLOYMENT_NAME!, - }), - logger - }, - // Tell the prompt that the plugin needs to be used - // Here you may also pass in additional configurations such as - // a tool-cache, which can be used to limit the tools that are used - // or improve performance - [new McpClientPlugin({ logger })], -) - .usePlugin("mcpClient", { - url: "http://my-remote-mcp-server.com/mcp/sse", - // Optional parameters to pass in - params: { - headers: { - // If your server requires authentication, you can pass in Bearer or other - // authentication headers here - "special-auth-token": 'Bearer 123', - }, - }, - }); - -app.on('message', async ({ send, activity }) => { - await send({ type: 'typing' }); - const result = await prompt.send(activity.text); - if (result.content) { - await send(result.content); - } -}); - -(async () => { - await app.start(); -})(); diff --git a/packages/cli/templates/typescript/mcpclient/tsconfig.json b/packages/cli/templates/typescript/mcpclient/tsconfig.json deleted file mode 100644 index 2c188ac0d..000000000 --- a/packages/cli/templates/typescript/mcpclient/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "module": "NodeNext", - "target": "ESNext", - "moduleResolution": "NodeNext", - "strict": true, - "noImplicitAny": true, - "declaration": true, - "inlineSourceMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": false, - "resolveJsonModule": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "pretty": true, - "outDir": "dist", - "rootDir": "src", - "types": ["node"] - } -} diff --git a/packages/cli/templates/typescript/mcpclient/tsup.config.js b/packages/cli/templates/typescript/mcpclient/tsup.config.js deleted file mode 100644 index 32277a72f..000000000 --- a/packages/cli/templates/typescript/mcpclient/tsup.config.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import('tsup').Options} */ -module.exports = { - dts: true, - minify: false, - bundle: false, - sourcemap: true, - treeshake: true, - splitting: true, - clean: true, - outDir: 'dist', - entry: ['src/index.ts'], - format: ['cjs'], -}; diff --git a/packages/cli/templates/typescript/tab/package.json.hbs b/packages/cli/templates/typescript/tab/package.json.hbs index 34fe82331..dc3ec9e83 100644 --- a/packages/cli/templates/typescript/tab/package.json.hbs +++ b/packages/cli/templates/typescript/tab/package.json.hbs @@ -17,8 +17,10 @@ "build:client": "npx vite build --outDir dist/client" }, "dependencies": { +"@microsoft/teams-js": "^2.0.0", "@microsoft/teams.apps": "latest", "@microsoft/teams.client": "latest", +"@microsoft/teams.common": "latest", "@microsoft/teams.graph-endpoints": "latest", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/packages/cli/templates/typescript/tab/src/Tab/App.tsx b/packages/cli/templates/typescript/tab/src/Tab/App.tsx index a5f636094..cfd711a9e 100644 --- a/packages/cli/templates/typescript/tab/src/Tab/App.tsx +++ b/packages/cli/templates/typescript/tab/src/Tab/App.tsx @@ -15,7 +15,7 @@ export default function App() { React.useEffect(() => { // initialize the app and prompt for Graph scope consent, if not already granted const app = new client.App(clientId, { - logger: new ConsoleLogger('@tests/tab', { level: 'debug' }), + logger: new ConsoleLogger('tab', { level: 'debug' }), msalOptions: { prewarmScopes: ['User.Read', 'Presence.ReadWrite', 'Team.ReadBasic.All'] } diff --git a/packages/cli/templates/typescript/tab/src/index.ts b/packages/cli/templates/typescript/tab/src/index.ts index 552e2e3aa..421d6ad9f 100644 --- a/packages/cli/templates/typescript/tab/src/index.ts +++ b/packages/cli/templates/typescript/tab/src/index.ts @@ -4,7 +4,7 @@ import { App } from '@microsoft/teams.apps'; import { ConsoleLogger } from '@microsoft/teams.common/logging'; const app = new App({ - logger: new ConsoleLogger('@tests/tab', { level: 'debug' }), + logger: new ConsoleLogger('tab', { level: 'debug' }), }); app.tab('test', path.resolve('dist/client')); @@ -22,7 +22,7 @@ app.function<{}, { message: string }>( app.on('message', async ({ activity, reply }) => { // simple echo bot - reply(`You said: ${activity.text}`); + await reply(`You said: ${activity.text}`); }); app.start(process.env.PORT || 3978).catch(console.error); diff --git a/packages/cli/tests/menu-loop.test.ts b/packages/cli/tests/menu-loop.test.ts index f6fbcb4ea..f50c8db9d 100644 --- a/packages/cli/tests/menu-loop.test.ts +++ b/packages/cli/tests/menu-loop.test.ts @@ -51,7 +51,7 @@ function setupMocks(): void { })); vi.mock('../src/project/scaffold.js', () => ({ - listTemplates: vi.fn().mockReturnValue(['echo', 'ai', 'graph', 'mcp', 'mcpclient', 'tab']), + listTemplates: vi.fn().mockReturnValue(['echo', 'graph', 'tab']), listToolkits: vi.fn().mockReturnValue(['basic', 'oauth', 'embed']), scaffoldProject: vi.fn().mockResolvedValue(undefined), addToolkitConfig: vi.fn().mockResolvedValue(undefined), From dd591aaa2109f19895bb53c734360121f778e79a Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 26 Jun 2026 16:33:04 -0700 Subject: [PATCH 2/2] Use maintained python-dotenv instead of deprecated dotenv in Python templates Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/cli/templates/python/echo/pyproject.toml.hbs | 2 +- packages/cli/templates/python/graph/pyproject.toml.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/templates/python/echo/pyproject.toml.hbs b/packages/cli/templates/python/echo/pyproject.toml.hbs index a698fa58c..bd8ae2fa7 100644 --- a/packages/cli/templates/python/echo/pyproject.toml.hbs +++ b/packages/cli/templates/python/echo/pyproject.toml.hbs @@ -7,7 +7,7 @@ readme = "README.md" requires-python = ">=3.12" dependencies = [ - "dotenv>=0.9.9", + "python-dotenv>=1.0.0", "microsoft-teams-apps" ] diff --git a/packages/cli/templates/python/graph/pyproject.toml.hbs b/packages/cli/templates/python/graph/pyproject.toml.hbs index 9c276b4ae..ee20695fb 100644 --- a/packages/cli/templates/python/graph/pyproject.toml.hbs +++ b/packages/cli/templates/python/graph/pyproject.toml.hbs @@ -7,7 +7,7 @@ requires-python = ">=3.12" dependencies = [ "microsoft-teams-apps", "microsoft-teams-graph", - "dotenv>=0.9.9" + "python-dotenv>=1.0.0" ] [dependency-groups]