---
title: "Microsoft Agent Framework"
description: "Construisez des workflows Microsoft Agent Framework Python ou .NET pour la recherche de tweets, les profils et les écritures X revues via TwexAPI MCP."
---

Construisez un agent Twitter API Microsoft Agent Framework via le serveur MCP de TwexAPI. Recherchez des tweets, inspectez des profils, lisez les tendances et revoyez les actions d'écriture. Persistez les ID de tweet, les curseurs et les noms de route en dehors du transcript de chat.

## Pourquoi utiliser Microsoft Agent Framework avec TwexAPI ?

Le framework héberge des agents avec appels d'outils en Python ou .NET. TwexAPI fournit `explore` et `twexapi_request` via Streamable HTTP.

| Tâche agent | Route TwexAPI | Préserver pour l'étape suivante |
| --- | --- | --- |
| Rechercher des tweets | `POST /twitter/advanced_search/page` | Requête, ID de tweet, auteurs, `created_at`, curseur |
| Inspecter un profil | `GET /twitter/{screen_name}/about` | ID utilisateur, username, biographie, nombre d'abonnés |
| Lister les abonnés | `POST /v3/twitter/users/followers` | Username, lignes d'abonnés, `next_cursor` |
| Publier ou répondre | `POST /twitter/tweets/create` | ID de tweet, route, approbation humaine, confirmation cookie |

Utilisez ce framework lorsque vous exécutez déjà des hosts Microsoft agent. Utilisez le [SDK Python](/sdks/python) ou le [SDK C#](/sdks/csharp) pour des jobs déterministes sans modèle.

## Prérequis

- Python 3.10 ou plus récent, ou un host .NET 8+ avec support MCP Streamable HTTP
- Une [clé API TwexAPI](https://twexapi.io/dashboard)
- Un modèle configuré pour le runtime agent
- Un cookie Twitter ou `auth_token` pour les actions d'écriture — consultez

Les lectures X publiques ne nécessitent pas des identifiants X Developer. Authentifiez avec TwexAPI.

## Installation

Python :

```bash
python -m pip install "agent-framework>=0.2" mcp python-dotenv pydantic
```

```txt .env
TWEXAPI_API_KEY=YOUR_API_KEY
OPENAI_API_KEY=sk-...
```

## Connecter TwexAPI MCP

```python
import os

from agent_framework import MCPStreamableHTTPTool

mcp_tool = MCPStreamableHTTPTool(
    name="twexapi",
    url="https://api.twexapi.io/mcp",
    headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
    description="TwexAPI X/Twitter tools through MCP",
)
```

JSON de host équivalent :

```json
{
  "name": "twexapi",
  "transport": "streamable-http",
  "url": "https://api.twexapi.io/mcp",
  "headers": {
    "x-api-key": "YOUR_API_KEY"
  }
}
```

Les requêtes MCP non authentifiées renvoient `401`.

## Exemple complet (Python)

```python
import asyncio
import os
from pathlib import Path
from typing import Literal

from agent_framework import ChatAgent, MCPStreamableHTTPTool
from agent_framework.openai import OpenAIChatClient
from dotenv import load_dotenv
from pydantic import BaseModel


class TweetRow(BaseModel):
    tweet_id: str
    text: str
    author_username: str | None = None
    created_at: str | None = None


class TweetSearchHandoff(BaseModel):
    query: str
    route_used: str
    tweets: list[TweetRow]
    has_more: bool
    next_cursor: str | None = None
    stop_reason: Literal[
        "complete",
        "requested_limit",
        "cursor_stalled",
        "page_cap",
    ]


async def main() -> None:
    load_dotenv()

    mcp_tool = MCPStreamableHTTPTool(
        name="twexapi",
        url="https://api.twexapi.io/mcp",
        headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
        description="TwexAPI X/Twitter tools through MCP",
    )

    async with mcp_tool:
        agent = ChatAgent(
            chat_client=OpenAIChatClient(model_id="gpt-4o"),
            name="twexapi_agent",
            instructions=(
                "Use TwexAPI MCP. Call explore before twexapi_request. "
                "Preserve exact IDs and cursors. Never invent missing fields. "
                "Ask for confirmation before read_only: false actions. "
                "Return only JSON for TweetSearchHandoff."
            ),
            tools=[mcp_tool],
        )

        response = await agent.run(
            "Search 25 recent tweets about Microsoft Agent Framework MCP. "
            "Return query, route_used, tweets, has_more, next_cursor, and stop_reason as JSON."
        )

        handoff = TweetSearchHandoff.model_validate_json(response.text)
        Path("twexapi-agent-framework-handoff.json").write_text(
            handoff.model_dump_json(indent=2),
            encoding="utf-8",
        )


asyncio.run(main())
```

Supprimez les fences Markdown si le modèle enveloppe le JSON. Persistez le fichier en dehors de l'état de conversation.

## Sketch de host .NET

```csharp
var mcp = new McpStreamableHttpTool
{
    Name = "twexapi",
    Url = new Uri("https://api.twexapi.io/mcp"),
    Headers = { ["x-api-key"] = Environment.GetEnvironmentVariable("TWEXAPI_API_KEY")! },
};
```

Utilisez la même instruction : `explore` en premier, préservez les curseurs, arrêtez avant `read_only: false`. Les appels REST typés appartiennent au [SDK C#](/sdks/csharp).

## Préserver le contrat de réponse MCP

Réutilisez la même requête et filtres sur chaque page. Traitez chaque curseur comme opaque.

Arrêtez la pagination lorsque le total demandé est atteint, `has_more` est false, `next_cursor` se répète ou le plafond de page est atteint.

## Maintenir un handoff agent résilient

<CardGroup cols={2}>
  <Card title="Pages de tweets" icon="message-square">
    Stockez `tweet_id`, `text`, `author_username`, `created_at`, `has_more`, `next_cursor` et la requête originale.
  </Card>
  <Card title="Lignes de profil" icon="user-round">
    Stockez `user_id`, `username`, `name`, `description` et les compteurs d'abonnés.
  </Card>
  <Card title="Pages d'abonnés" icon="users">
    Stockez le username source, les lignes d'abonnés, `next_cursor` et l'index de page.
  </Card>
  <Card title="Actions d'écriture" icon="send">
    Stockez la route, le texte de prévisualisation et l'approbation. Gardez les cookies hors du fichier de handoff. Consultez.
  </Card>
</CardGroup>

Consultez [Agent MCP Handoff](/mcp/agent-handoff).

## Construire la gestion des erreurs

| Statut | Signification | Décision agent |
| --- | --- | --- |
| `400` | Route ou paramètres invalides | Corrigez la requête avant de réessayer |
| `401` | Clé API manquante ou invalide | Arrêtez et remplacez l'identifiant |
| `403` | Accès refusé ou crédits | Pausez les écritures ; consultez [Get Balance](/api-reference/balance-endpoints/get-balance-api-balance-get) |
| `429` | Limite de débit atteinte | Ralentissez, puis reprenez le même curseur |
| `5xx` | Défaillance serveur temporaire | Appliquez un backoff borné aux lectures sûres |

Ne jamais réessayer une écriture après un timeout sans vérification de lecture. Consultez [Gestion des erreurs](/guides/error-handling) et [Limites de débit](/guides/rate-limits).

## Exiger une approbation avant les actions X

```txt
You have access to TwexAPI MCP tools.
Call explore before twexapi_request.
Use only relative paths returned by explore.
Return tweet_id, user_id, author_username, route_used, has_more, and next_cursor.
Ask for confirmation before read_only: false actions.
Never print cookie or auth_token values.
```

Prévisualisez avec le [CLI](/sdks/cli) `--dry-run`. Exécutez les écritures approuvées via REST ou un SDK, pas une boucle d'agent non supervisée.

## Conseils de production

- Utilisez une clé API par environnement. Ne pas intégrer des clés dans les prompts.
- Journalisez les noms d'outils MCP et les valeurs `path` retournées, pas les headers cookie.
- Persistez les curseurs et ID de tweet dans votre store, pas uniquement dans la mémoire `ChatAgent`.
- Séparez la recherche en lecture et l'exécution d'écriture dans des agents ou jobs distincts.

## Versions des packages

| Package | Plage supportée |
| --- | --- |
| Python | `>=3.10` |
| `agent-framework` | `>=0.2` |
| `mcp` | `>=1.9` |
| `pydantic` | `>=2.7` |

## Prochaines étapes

- [Outils MCP](/mcp/tools)
- [Agent MCP Handoff](/mcp/agent-handoff)
-
- [SDK Python](/sdks/python)
- [SDK C#](/sdks/csharp)
- [Advanced Twitter Search](/api-reference/search-endpoints/get-data-page-twitter-advanced-search-page-post)
