Back to Skills
    🦞

    teams-anthropic-integration

    Use @youdotcom-oss/teams-anthropic

    By @edwardirby
    View on GitHub
    SKILL.md
    ---
    name: teams-anthropic-integration
    description: Use @youdotcom-oss/teams-anthropic to add Anthropic Claude models (Opus, Sonnet, Haiku) to Microsoft Teams.ai applications. Optionally integrate You.com MCP server for web search and content extraction.
    license: MIT
    compatibility: Node.js 18+, @microsoft/teams.ai
    metadata:
      author: youdotcom-oss
      category: enterprise-integration
      version: "1.1.0"
      keywords: microsoft-teams,teams-ai,anthropic,claude,mcp,you.com,web-search,content-extraction
    ---
    
    # Build Teams.ai Apps with Anthropic Claude
    
    Use `@youdotcom-oss/teams-anthropic` to add Claude models (Opus, Sonnet, Haiku) to Microsoft Teams.ai applications. Optionally integrate You.com MCP server for web search and content extraction.
    
    ## Choose Your Path
    
    **Path A: Basic Setup** (Recommended for getting started)
    - Use Anthropic Claude models in Teams.ai
    - Chat, streaming, function calling
    - No additional dependencies
    
    **Path B: With You.com MCP** (For web search capabilities)
    - Everything in Path A
    - Web search and content extraction via You.com
    - Real-time information access
    
    ## Decision Point
    
    **Ask: Do you need web search and content extraction in your Teams app?**
    
    - **NO** → Use **Path A: Basic Setup** (simpler, faster)
    - **YES** → Use **Path B: With You.com MCP**
    
    ---
    
    ## Path A: Basic Setup
    
    Use Anthropic Claude models in your Teams.ai app without additional dependencies.
    
    ### A1. Install Package
    
    ```bash
    npm install @youdotcom-oss/teams-anthropic @anthropic-ai/sdk @microsoft/teams.ai
    ```
    
    ### A2. Get Anthropic API Key
    
    Get your API key from [console.anthropic.com](https://console.anthropic.com/)
    
    ```bash
    # Add to .env
    ANTHROPIC_API_KEY=your-anthropic-api-key
    ```
    
    ### A3. Ask: New or Existing App?
    
    - **New Teams app**: Use entire template below
    - **Existing app**: Add Claude model to existing setup
    
    ### A4. Basic Template
    
    **For NEW Apps:**
    
    ```typescript
    import { App } from '@microsoft/teams.apps';
    import { AnthropicChatModel, AnthropicModel } from '@youdotcom-oss/teams-anthropic';
    
    if (!process.env.ANTHROPIC_API_KEY) {
      throw new Error('ANTHROPIC_API_KEY environment variable is required');
    }
    
    const model = new AnthropicChatModel({
      model: AnthropicModel.CLAUDE_SONNET_4_5,
      apiKey: process.env.ANTHROPIC_API_KEY,
      requestOptions: {
        max_tokens: 2048,
        temperature: 0.7,
      },
    });
    
    const app = new App();
    
    app.on('message', async ({ send, activity }) => {
      await send({ type: 'typing' });
    
      const response = await model.send(
        { role: 'user', content: activity.text }
      );
    
      if (response.content) {
        await send(response.content);
      }
    });
    
    app.start().catch(console.error);
    ```
    
    **For EXISTING Apps:**
    
    Add to your existing imports:
    ```typescript
    import { AnthropicChatModel, AnthropicModel } from '@youdotcom-oss/teams-anthropic';
    ```
    
    Replace your existing model:
    ```typescript
    const model = new AnthropicChatModel({
      model: AnthropicModel.CLAUDE_SONNET_4_5,
      apiKey: process.env.ANTHROPIC_API_KEY,
    });
    ```
    
    ### A5. Choose Your Model
    
    ```typescript
    // Most capable - best for complex tasks
    AnthropicModel.CLAUDE_OPUS_4_5
    
    // Balanced intelligence and speed (recommended)
    AnthropicModel.CLAUDE_SONNET_4_5
    
    // Fast and efficient
    AnthropicModel.CLAUDE_HAIKU_3_5
    ```
    
    ### A6. Test Basic Setup
    
    ```bash
    npm start
    ```
    
    Send a message in Teams to verify Claude responds.
    
    ---
    
    ## Path B: With You.com MCP
    
    Add web search and content extraction to your Claude-powered Teams app.
    
    ### B1. Install Packages
    
    ```bash
    npm install @youdotcom-oss/teams-anthropic @anthropic-ai/sdk @microsoft/teams.ai @microsoft/teams.mcpclient
    ```
    
    ### B2. Get API Keys
    
    - **Anthropic API key**: [console.anthropic.com](https://console.anthropic.com/)
    - **You.com API key**: [you.com/platform/api-keys](https://you.com/platform/api-keys)
    
    ```bash
    # Add to .env
    ANTHROPIC_API_KEY=your-anthropic-api-key
    YDC_API_KEY=your-you-com-api-key
    ```
    
    ### B3. Ask: New or Existing App?
    
    - **New Teams app**: Use entire template below
    - **Existing app**: Add MCP to existing Claude setup
    
    ### B4. MCP Template
    
    **For NEW Apps:**
    
    ```typescript
    import { App } from '@microsoft/teams.apps';
    import { ChatPrompt } from '@microsoft/teams.ai';
    import { ConsoleLogger } from '@microsoft/teams.common';
    import { McpClientPlugin } from '@microsoft/teams.mcpclient';
    import {
      AnthropicChatModel,
      AnthropicModel,
      getYouMcpConfig,
    } from '@youdotcom-oss/teams-anthropic';
    
    // Validate environment
    if (!process.env.ANTHROPIC_API_KEY) {
      throw new Error('ANTHROPIC_API_KEY environment variable is required');
    }
    
    if (!process.env.YDC_API_KEY) {
      throw new Error('YDC_API_KEY environment variable is required');
    }
    
    // Configure logger
    const logger = new ConsoleLogger('mcp-client', { level: 'info' });
    
    // Create prompt with MCP integration
    const prompt = new ChatPrompt(
      {
        instructions: 'You are a helpful assistant with access to web search and content extraction. Use these tools to provide accurate, up-to-date information.',
        model: new AnthropicChatModel({
          model: AnthropicModel.CLAUDE_SONNET_4_5,
          apiKey: process.env.ANTHROPIC_API_KEY,
          requestOptions: {
            max_tokens: 2048,
          },
        }),
      },
      [new McpClientPlugin({ logger })],
    ).usePlugin('mcpClient', getYouMcpConfig());
    
    const app = new App();
    
    app.on('message', async ({ send, activity }) => {
      await send({ type: 'typing' });
    
      const result = await prompt.send(activity.text);
      if (result.content) {
        await send(result.content);
      }
    });
    
    app.start().catch(console.error);
    ```
    
    **For EXISTING Apps with Claude:**
    
    If you already have Path A setup, add MCP integration:
    
    1. **Install MCP dependencies:**
       ```bash
       npm install @microsoft/teams.mcpclient
       ```
    
    2. **Add imports:**
       ```typescript
       import { ChatPrompt } from '@microsoft/teams.ai';
       import { ConsoleLogger } from '@microsoft/teams.common';
       import { McpClientPlugin } from '@microsoft/teams.mcpclient';
       import { getYouMcpConfig } from '@youdotcom-oss/teams-anthropic';
       ```
    
    3. **Validate You.com API key:**
       ```typescript
       if (!process.env.YDC_API_KEY) {
         throw new Error('YDC_API_KEY environment variable is required');
       }
       ```
    
    4. **Replace model with ChatPrompt:**
       ```typescript
       const logger = new ConsoleLogger('mcp-client', { level: 'info' });
    
       const prompt = new ChatPrompt(
         {
           instructions: 'Your instructions here',
           model: new AnthropicChatModel({
             model: AnthropicModel.CLAUDE_SONNET_4_5,
             apiKey: process.env.ANTHROPIC_API_KEY,
           }),
         },
         [new McpClientPlugin({ logger })],
       ).usePlugin('mcpClient', getYouMcpConfig());
       ```
    
    5. **Use prompt.send() instead of model.send():**
       ```typescript
       const result = await prompt.send(activity.text);
       ```
    
    ### B5. Test MCP Integration
    
    ```bash
    npm start
    ```
    
    Ask Claude a question that requires web search:
    - "What are the latest developments in AI?"
    - "Search for React documentation"
    - "Extract content from https://example.com"
    
    ---
    
    ## Available Claude Models
    
    | Model | Enum | Best For |
    |-------|------|----------|
    | Claude Opus 4.5 | `AnthropicModel.CLAUDE_OPUS_4_5` | Complex tasks, highest capability |
    | Claude Sonnet 4.5 | `AnthropicModel.CLAUDE_SONNET_4_5` | Balanced intelligence and speed (recommended) |
    | Claude Haiku 3.5 | `AnthropicModel.CLAUDE_HAIKU_3_5` | Fast responses, efficiency |
    | Claude Sonnet 3.5 | `AnthropicModel.CLAUDE_SONNET_3_5` | Previous generation, stable |
    
    ## Advanced Features
    
    ### Streaming Responses
    
    ```typescript
    const response = await model.send(
      { role: 'user', content: 'Write a short story' },
      {
        onChunk: async (delta) => {
          // Stream each token as it arrives
          process.stdout.write(delta);
        },
      }
    );
    ```
    
    ### Function Calling
    
    ```typescript
    const response = await model.send(
      { role: 'user', content: 'What is the weather in San Francisco?' },
      {
        functions: {
          get_weather: {
            description: 'Get the current weather for a location',
            parameters: {
              location: { type: 'string', description: 'City name' },
            },
            handler: async (args: { location: string }) => {
              // Your API call here
              return { temperature: 72, conditions: 'Sunny' };
            },
          },
        },
      }
    );
    ```
    
    ### Conversation Memory
    
    ```typescript
    import { LocalMemory } from '@microsoft/teams.ai';
    
    const memory = new LocalMemory();
    
    // First message
    await model.send(
      { role: 'user', content: 'My name is Alice' },
      { messages: memory }
    );
    
    // Second message - Claude remembers
    const response = await model.send(
      { role: 'user', content: 'What is my name?' },
      { messages: memory }
    );
    // Response: "Your name is Alice."
    ```
    
    ## Validation Checklist
    
    ### Path A Checklist
    
    - [ ] Package installed: `@youdotcom-oss/teams-anthropic`
    - [ ] Environment variable set: `ANTHROPIC_API_KEY`
    - [ ] Model configured with `AnthropicChatModel`
    - [ ] Model selection chosen (Opus/Sonnet/Haiku)
    - [ ] App tested with basic messages
    
    ### Path B Checklist
    
    - [ ] All Path A items completed
    - [ ] Additional package installed: `@microsoft/teams.mcpclient`
    - [ ] Environment variable set: `YDC_API_KEY`
    - [ ] Logger configured
    - [ ] ChatPrompt configured with `getYouMcpConfig()`
    - [ ] App tested with web search queries
    
    ## Common Issues
    
    ### Path A Issues
    
    **"Cannot find module @youdotcom-oss/teams-anthropic"**
    ```bash
    npm install @youdotcom-oss/teams-anthropic @anthropic-ai/sdk
    ```
    
    **"ANTHROPIC_API_KEY environment variable is required"**
    - Get key from: https://console.anthropic.com/
    - Add to .env: `ANTHROPIC_API_KEY=your-key-here`
    
    **"Invalid model identifier"**
    - Use enum: `AnthropicModel.CLAUDE_SONNET_4_5`
    - Don't use string: `'claude-sonnet-4-5-20250929'`
    
    ### Path B Issues
    
    **"YDC_API_KEY environment variable is required"**
    - Get key from: https://you.com/platform/api-keys
    - Add to .env: `YDC_API_KEY=your-key-here`
    
    **"MCP connection fails"**
    - Verify API key is valid at https://you.com/platform/api-keys
    - Check network connectivity
    - Review logger output fo
    
    ... (truncated)