Foundry Agents MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Foundry Agents MCP ServerInvoke the research workflow with task: analyze AI trends"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Foundry Agents MCP Server
An MCP (Model Context Protocol) server that exposes Azure AI Foundry agents, workflows, and AI Search vector-database capabilities as MCP tools.
Supports two transports:
stdio – for local use with
uvxor VS Code CopilotHTTP – for deployment to Azure Container Apps via
azd up
Repository layout
src/
foundry_agents_mcp/ ← MCP server (10 tools across 4 namespaces)
foundry_agents/ ← Standalone agent & workflow implementations
definitions/ ← Declarative YAML agent & workflow definitions
case_study_agent.py ← deploy-case-study-agent CLI command
architecture_agent.py ← deploy-architecture-agent CLI command
project_log_workflow.py ← run-project-log-workflow CLI command
infra/
main.bicep ← Container Apps + managed identity + role assignments
app/server.bicep ← Container App definition with health probes
core/security/role.bicep
azure.yaml ← azd service definition
Dockerfile ← Multi-stage Alpine build
entrypoint.sh ← Selects stdio or HTTP transport at startup
.env.sample ← Template for local environment configurationRelated MCP server: Azure AI Foundry Agent MCP
MCP tool namespaces
Namespace | Tools |
| List agents · Invoke agent · Check status · Get result |
| Semantic vector search · Add document to vector DB |
| Create project-log index · Ingest project log entry |
| List sample workflows · Run project-log pipeline |
Prerequisites
Python 3.10+
uv installed
An Azure AI Foundry project (for agent tools)
An Azure AI Search resource with a vector-capable tier (for search/index tools)
An Azure OpenAI resource with a text-embedding model deployed
Quick start with uvx
# Install and run directly from GitHub (no PyPI package required)
uvx --from git+https://github.com/denniszielke/foundry-agents-mcp-server@main foundry-agents-mcp-serverOr with an explicit environment file:
uvx --from git+https://github.com/denniszielke/foundry-agents-mcp-server@main --env-file .env foundry-agents-mcp-serverConfiguration
All configuration is driven by environment variables. Copy .env.sample to .env
and fill in your values.
Variable | Required | Description |
| For agent tools | AI Foundry project endpoint – |
| No | OpenAI-compatible endpoint (falls back to |
| For workflow tools | Completion model deployment name in the Foundry account |
| For search/index tools | Embedding model deployment name (default: |
| No | Embedding vector size (default: |
| For search/index tools | Azure AI Search service endpoint URL |
| No | Search index name (default: |
| No | Application Insights connection string for telemetry |
Note – When deploying via
azd up, all these values are written to.envautomatically byinfra/write_env.sh. For local development runaz loginand useDefaultAzureCredential; no API keys are needed.
Claude Desktop configuration
Add the following to your claude_desktop_config.json:
{
"mcpServers": {
"foundry-agents": {
"command": "uvx",
"args": ["--from", "git+https://github.com/denniszielke/foundry-agents-mcp-server@main", "foundry-agents-mcp-server"],
"env": {
"AZURE_AI_PROJECT_ENDPOINT": "https://...",
"AZURE_AI_SEARCH_ENDPOINT": "https://...",
"AZURE_OPENAI_ENDPOINT": "https://..."
}
}
}
}Tool reference and example prompts
agents namespace
agents_list_agents
List all agents and workflows available in the Foundry project, including their IDs, models, descriptions, and tool capabilities.
Example prompts
"What agents are available in the project?"
"List all AI workflows I can invoke"
"Show me the agents and their capabilities in this Foundry project"
agents_invoke_agent
Invoke an agent or workflow asynchronously. Returns an invocation ID to track progress.
Parameter | Type | Description |
| string | Agent ID from |
| string | Task description or question |
| string (optional) | Additional text or file content as context |
Example prompts
"Ask agent
<agent_id>to summarize the latest Azure AI announcements""Invoke the research workflow with task: analyze competitive landscape for AI services"
"Send this document to the analysis agent and include the file text as context:
<text>"
agents_get_invocation_status
Check whether an agent invocation is still running or has completed.
Parameter | Type | Description |
| string | Invocation ID from |
Possible statuses: queued, in_progress, requires_action, cancelling,
cancelled, failed, completed, expired
Example prompts
"Check the status of invocation
<invocation_id>""Has my agent task finished? ID:
<invocation_id>""Is the workflow still running for invocation
<invocation_id>?"
agents_get_invocation_result
Retrieve the text (and file reference) output from a completed invocation.
Parameter | Type | Description |
| string | Invocation ID from |
Example prompts
"Get the results from invocation
<invocation_id>""What did the agent return for ID
<invocation_id>?""Show me the output of the completed workflow:
<invocation_id>"
search namespace
search_vector_db
Perform a semantic (vector) search over the project-log index.
Parameter | Type | Description |
| string | Natural language search query |
| integer (optional) | Number of results (default: 5) |
Example prompts
"Find project logs related to Azure Kubernetes Service"
"Search for workshop summaries about machine learning"
"What meetings discussed security architecture?"
"Find blog posts about microservices, return top 10 results"
search_add_to_vector_db
Add a document to the project-log vector index. The content is automatically embedded and stored alongside the metadata.
Parameter | Type | Description |
| string | Document title |
| string | Main text to embed and index |
| string (optional) |
|
| string (optional) | Customer or organization name |
| string (optional) | Brief summary |
| string (optional) | Associated project name |
| string (optional) | Comma-separated tags (e.g. |
| string (optional) | Source URL |
| string (optional) | Architecture diagram as JSON or XML |
Example prompts
"Add this meeting summary to the vector database: title='Azure Workshop', content='...'"
"Store a new project log entry about our Kubernetes migration discussion"
"Index this blog post with tags: azure, containers, devops"
index namespace
index_create_project_log_index
Create the project-log Azure AI Search index with the correct schema and HNSW vector configuration. Safe to call when the index already exists.
Schema fields
Field | Type | Notes |
| String (key) | Auto-generated UUID |
| String | Searchable, filterable, sortable |
| String | Filterable, facetable ( |
| String | Filterable, facetable |
| String | Searchable |
| String | Searchable (full body text) |
| Collection(Single) | HNSW vector search field |
| String | Filterable, facetable |
| Collection(String) | Filterable, facetable |
| String | Searchable |
| String | Searchable |
| DateTimeOffset | Filterable, sortable |
| DateTimeOffset | Filterable, sortable |
Example prompts
"Set up the project log search index"
"Create the Azure AI Search index for storing project summaries"
"Initialize the vector database schema for project logs"
index_ingest_project_log
Ingest a single project log entry into the index. The index is created automatically if it does not exist.
Parameter | Type | Description |
| string | Log entry title |
| string |
|
| string | Customer or organization name |
| string | Brief summary (1–2 sentences) |
| string | Full context text (will be embedded) |
| string (optional) | Project name |
| string (optional) | Comma-separated tags |
| string (optional) | Source URL |
| string (optional) | Architecture diagram as JSON or XML |
Example prompts
"Add a workshop log: title='Azure AI Day', entry_type='workshop', customer_name='Contoso', context='...'"
"Index a new meeting summary about the cloud migration project"
"Store this repo documentation with tags: python, mcp, azure"
Sample agents and workflow
The foundry_agents package provides two sample agents and a pipeline workflow
that work independently of the MCP server.
Deploy agents to Azure AI Foundry
Register the sample agents in your Foundry project (they then appear in
agents_list_agents and can be invoked with agents_invoke_agent):
deploy-case-study-agent # registers CaseStudyAgent
deploy-architecture-agent # registers ArchitectureAgentRun the project-log workflow
Fetch a Microsoft customer story, extract metadata, generate an architecture diagram, and store everything in the vector index – all in one command:
run-project-log-workflow \
--url "https://www.microsoft.com/en/customers/story/25676-commerzbank-ag-azure-ai-foundry-agent-service" \
--project "Commerzbank AI Platform"Or trigger the same pipeline from the MCP server:
Run the project log workflow for https://www.microsoft.com/en/customers/story/...The workflow automatically uses deployed Foundry agents when available and falls back to direct Azure OpenAI inference otherwise.
Deploy to Azure Container Apps
The server can be deployed to Azure Container Apps with a single command using the Azure Developer CLI (azd).
What gets provisioned
Resource | Purpose |
Virtual Network | Container Apps environment runs VNet-integrated (always) |
Container Apps Environment | Hosts the MCP server; set |
Azure Container Registry | Stores the Docker image |
Log Analytics + Application Insights | Telemetry and distributed traces |
Azure AI Foundry (AIServices + project) | Agents API + model deployments (completion + embedding) |
Azure AI Search | Vector search index for the project log |
User-assigned Managed Identity | Passwordless auth – assigned Azure AI Developer, Cognitive Services OpenAI User, Search Index Data Contributor, and AcrPull roles |
Infra folder structure
infra/
abbreviations.json ← Azure resource name prefixes
main.bicep ← Subscription-scoped orchestrator
main.parameters.json ← azd parameter file
ai/
foundry.bicep ← AIServices account + Foundry project + model deployments
search.bicep ← Azure AI Search
app/
server.bicep ← MCP server Container App + identity
core/
host/
vnet.bicep ← VNet with aca-apps subnet (always deployed)
container-apps.bicep ← Environment + registry orchestration
container-apps-environment.bicep ← Managed environment (usePrivateIngress flag)
container-app.bicep ← Container App with health probes + role assignments
container-app-upsert.bicep
container-registry.bicep
monitor/
monitoring.bicep ← Log Analytics + Application Insights
loganalytics.bicep
applicationinsights.bicep
security/
foundry-access.bicep ← Azure AI Developer + Cognitive Services OpenAI User
registry-access.bicep ← AcrPull
search-access.bicep ← Search Index Data ContributorQuick deploy
# 1. Login
azd auth login
# 2. Create an azd environment
azd env new foundry-mcp
azd env set AZURE_LOCATION swedencentral # or eastus2, westus3, northcentralus
# 3. (Optional) private ingress – accessible only from within the VNet
azd env set USE_PRIVATE_INGRESS true
# 4. Provision infrastructure (no local Docker required)
azd upazd up will:
Provision all resources (VNet, Container Apps, Foundry, Search, monitoring)
Run
infra/write_env.shto populate.envwith all endpoint values
Build and deploy the container
The container image is built remotely using Azure Container Registry (ACR) –
no local Docker installation is required. After azd up has provisioned the
infrastructure, run:
# Build in ACR and deploy the Container App
./azd-hooks/deploy.sh foundry-mcp # pass your azd environment nameThe script will:
Build the Docker image remotely in ACR via
az acr buildDeploy the Container App via a Bicep deployment (
infra/app/server.bicep)Print the MCP server URL
Private ingress
When USE_PRIVATE_INGRESS=true the Container Apps environment is configured as
internal: true and the Container App ingress is set to external: false. The
MCP server is then only reachable from within the VNet (e.g. via a jump host,
VPN, or another Container App in the same environment).
Connect VS Code Copilot to the deployed server
# Find the URL
cat .env | grep MCP_SERVER_URLOpen Command Palette in VS Code → MCP: Add Server → HTTP.
Enter the URL from
.env(e.g.https://<app-fqdn>/mcp).All 10 Foundry Agent tools are now available in Copilot Chat.
Run locally with HTTP transport
# Start the HTTP server (same code, same image)
uvicorn foundry_agents_mcp.server:http_app --host 0.0.0.0 --port 8000
# Test the health probe
curl http://localhost:8000/health
# → {"status":"healthy","service":"foundry-agents-mcp-server"}Monitoring
OpenTelemetry tracing is enabled automatically when
APPLICATIONINSIGHTS_CONNECTION_STRING is set. Every MCP tool call and HTTP
request is traced via azure-monitor-opentelemetry.
azd monitor # open the Application Insights dashboard in the portalTear down
azd downDevelopment
# Clone and install in editable mode
git clone https://github.com/denniszielke/foundry-agents-mcp-server
cd foundry-agents-mcp-server
pip install -e ".[dev]"
# Run locally (stdio)
python -m foundry_agents_mcpLicense
MIT
Available Tools
10 toolsagents_get_invocation_resultA
Retrieve the text or file results from a completed agent or workflow invocation.
| Name | Required | Description | Default |
|---|---|---|---|
| invocation_id | Yes | The invocation ID returned by agents_invoke_agent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosure. It indicates results can be text OR files, which adds value, but doesn't specify what happens if the invocation hasn't completed, error behavior, or what the file results look like. The description does state the 'completed' precondition which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence captures both the purpose and the return content type (text/files). Zero wasted words, front-loaded with the core action. Ideal conciseness for a straightforward retrieval tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 1 fully-documented parameter, an output schema present, and a clear single-sentence description covering what's retrieved and from what context, the tool is well-specified. The description could add what happens on a pending invocation, but the 'completed' qualifier plus the sibling status tool gives adequate context. Output schema handles return-value documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter invocation_id has 100% schema coverage with a clear description of what it is ('returned by agents_invoke_agent'). The description's 'completed invocation' framing adds context that the parameter must reference a finished invocation. With full schema coverage and only 1 parameter, there's little the description needs to add beyond what's provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: retrieve text or file results from a completed agent or workflow invocation. It specifies the verb (retrieve), resource (invocation results), and distinguishes itself from sibling agents_get_invocation_status which checks status rather than retrieving results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The condition 'completed invocation' implies this is for results after completion, distinguishing from agents_get_invocation_status which checks status during execution. It doesn't explicitly reference the sibling status tool or state when NOT to use it, but the 'completed' qualifier provides useful contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agents_get_invocation_statusB
Check the status of an agent or workflow invocation.
| Name | Required | Description | Default |
|---|---|---|---|
| invocation_id | Yes | The invocation ID returned by agents_invoke_agent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description is a single terse sentence that doesn't explain polling behavior, whether it's idempotent/read-only, what the status values might be, whether it can be called repeatedly, or any rate-limit considerations. For a status-checking tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with zero waste. It's front-loaded with the core action. It could add more behavioral detail without becoming verbose, but as it stands it is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation isn't needed. However, with no annotations and a status-checking tool where the state model is critical (what statuses exist, is it polling-safe, how long invocations take), the description alone is minimally adequate. It would benefit from describing the lifecycle or status values to be truly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the only parameter (invocation_id) clearly documented as the ID returned by agents_invoke_agent. The description itself adds no parameter detail, but the schema fully covers the parameter, and the cross-reference to agents_invoke_agent adds useful contextual meaning. Baseline 3 with the cross-reference justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Check the status of an agent or workflow invocation' with a clear verb (check) and resource (invocation status). It distinguishes from siblings like agents_get_invocation_result (which gets results) and agents_invoke_agent (which starts an invocation). It's clear but not very specific about what 'status' encompasses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or exclusions are provided. However, the schema parameter 'invocation_id' referencing agents_invoke_agent implies a workflow of invoke-then-check-status, which provides some implicit context. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agents_invoke_agentA
Invoke an agent or workflow with a task and optional context.
Creates a new conversation thread, submits the task, and returns an invocation ID that can be used with agents_get_invocation_status and agents_get_invocation_result.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The task description or question to send to the agent. | |
| agent_id | Yes | The ID of the agent or workflow to invoke (from agents_list_agents). | |
| file_context | No | Optional additional text or file content to include as context. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does reveal key side effects: it creates a new conversation thread (rather than continuing an existing one) and performs is asynchronous by returning an ID rather than a result. However, it does not mention potential side effects, whether the invocation is blocking or fire-and-forget beyond the ID pattern, or any auth/rate-limit constraints. The behavioral descriptions given are accurate and useful but somewhat minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the primary action and immediately clarifying the return artifact. Every sentence earns its place, though the lifecycle info about thread creation and ID return is packed compactly. No wasted words, though the 'optional context' phrase slightly duplicates the parameter description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is an asynchronous invocation tool with an output schema and well-documented parameters, the description is reasonably complete. It explains the async pattern (returns ID, use status/result tools), which is essential operational knowledge. It could add a bit more about the relationship between the file_context param and typical agent usage, but for a tool whose complexity is moderate and whose lifecycle is clearly mapped to siblings, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% coverage with descriptions for all 3 parameters, so the baseline is 3. The description adds value by clarifying that the returned invocation ID pairs with specific sibling tools for status polling and result retrieval, which helps the agent understand how the output parameter relates to the workflow. It also indicates that task is the required payload while file_context is optional supplementary context. This adds meaningful orchestration context beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Invoke an agent or workflow'), the resource ('with a task and optional context'), and outlines the specific lifecycle: creates a new thread, submits the task, and returns an invocation ID. It also distinguishes itself by pointing to sibling tools (agents_get_invocation_status and agents_get_invocation_result) for following up, which clarifies its role as the initiation step in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys when this tool is appropriate: to start an agent invocation and obtain an ID for later polling. It names the status and result retrieval tools as the follow-up path, providing clear context on the lifecycle. However, it does not explicitly state when NOT to use this tool (e.g., when you just want to list agents) or name agents_list_agents as a prerequisite-alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agents_list_agentsA
List all available agents and workflows in the Azure AI Foundry project.
Returns a formatted list of published agents including their IDs, models, descriptions, and available tools/capabilities.
Example prompts:
"What agents are available in the project?"
"List all AI workflows I can invoke"
"Show me the agents and their capabilities in this Foundry project"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosure. It usefully states that this is a read-only listing operation ('Returns a formatted list'), which implies no side effects. However, it doesn't describe pagination, sorting, or whether the returned list could be large or need to be queried differently. The read-only nature is implied but not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact (two short paragraphs plus example prompts) and front-loaded with the core purpose in the first sentence. The example prompts section is helpful but adds some length; it earns its place by making cases concrete. No wasted verbiage present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and 0 parameters, so the main thing the description needs to cover is what gets listed and the return format. It covers what's returned (IDs, models, descriptions, capabilities) and notes 'formatted list'. Given a no-parameter tool with an output schema, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so there are no parameter semantics to describe. Per the rubric, 0 params earns a baseline of 4. The description appropriately focuses on the return value (the list of agents with their details) which is the meaningful output content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and specific resource ('all available agents and workflows in the Azure AI Foundry project'). It also describes what's returned (IDs, models, descriptions, capabilities), distinguishing this from siblings like agents_invoke_agent which clearly does invocation rather than listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes example prompts that implicitly tell an agent when to use it (when a user asks about available agents/workflows). However, it doesn't explicitly contrast with alternatives like workflows_list_sample_workflows, nor does it state when NOT to use it. The usage context is clear but exclusions/alternatives are not named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_create_project_log_indexA
Create the project log search index in Azure AI Search.
Sets up the index schema including vector search capabilities for semantic similarity search on the context field. The schema supports: title, type, customer_name, short_summary, context (+ embedding vector), project_name, tags, reference_url, architecture, creation_date, modified_date.
Safe to call if the index already exists – it will return a confirmation without modifying the existing index.
Example prompts:
"Set up the project log search index"
"Create the Azure AI Search index for storing project summaries"
"Initialize the vector database schema for project logs"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses idempotency (returns confirmation without modifying existing index), which is valuable behavioral context. It also lists the full set of fields/schema supported, giving the agent a clear picture of what gets created. Could add more about latency or side effects but is solid for a no-parameter setup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections, front-loaded with the core purpose sentence, then supporting details and example prompts. The field list is a bit verbose but useful. The example prompts add practical value. Slightly long but every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, idempotent setup tool, the description is quite complete. It covers what gets created (all fields incl. vector embedding), idempotency behavior, and example invocations. The output schema exists, so return values aren't needed. Minor gap: doesn't clarify preconditions like whether an Azure AI Search resource must already exist, but this is a well-covered setup operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so there is nothing to explain beyond what the schema shows. Schema coverage is 100% with an empty parameter list. The description zeroes in on what the tool accomplishes rather than parameters, which is appropriate for a parameterless operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Create the project log search index in Azure AI Search') and lists the detailed schema fields it sets up. It clearly distinguishes from siblings like index_ingest_project_log (ingesting data) and search_vector_db (searching).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on what the tool does and explicitly notes it's safe to call idempotently ('Safe to call if the index already exists'). Includes example prompts showing intended usage patterns. However, it doesn't explicitly state when NOT to use it versus alternatives (e.g., vs ingest for populating data).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_ingest_project_logB
Ingest a project log entry into the Azure AI Search index with vector embeddings.
Generates a vector embedding for the context field and stores the complete project log entry. Creates the index automatically if it does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated technology/product tags (e.g. "azure,kubernetes,devops"). | |
| title | Yes | Title of the project log entry. | |
| context | Yes | Full context or body text (will be vectorized for search). | |
| entry_type | Yes | Entry type: workshop, meeting, blog, or repo. | |
| architecture | No | Architecture diagram as JSON or XML string. | |
| project_name | No | Project name for filtering/faceting. | |
| customer_name | Yes | Customer or organization name. | |
| reference_url | No | External source URL. | |
| short_summary | Yes | Brief summary (1–2 sentences). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does state that it generates embeddings and auto-creates the index, which are meaningful behaviors. However, it doesn't disclose whether existing entries are overwritten, whether the title/short_summary are also vectorized vs only context, or what happens on re-ingestion of the same entry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient at three sentences, front-loaded with the core purpose and covering the notable side effect (auto-creating index) plus the embedding behavior. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema covers all 9 parameters thoroughly, and an output schema exists so return-value documentation isn't required. The description covers the ingestion behavior and auto-create side effect. However, for a mutation tool with a side effect (index auto-creation) and no annotations, it could disclose more about failure modes or whether existing documents are updated or appended.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the key semantic point that the context field is the one vectorized for search, which is valuable beyond the schema's terse 'will be vectorized for search' note. However, it doesn't add much else beyond what the schema already documents for the other 8 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: ingesting a project log entry into an Azure AI Search index with vector embeddings. It distinguishes from siblings like index_create_project_log_index (which only creates the index) by noting it stores the entry and generates embeddings. However, it doesn't explicitly contrast with search_add_to_vector_db, though the 'creates the index automatically' note does partially differentiate it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the ingestion behavior and that it auto-creates the index, providing clear context for when to use this operation. However, it doesn't explicitly state when NOT to use it or name sibling alternatives, such as when to prefer search_add_to_vector_db or when to first create the index manually with index_create_project_log_index.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_add_to_vector_dbA
Add a new document to the project vector database.
Generates a vector embedding for the content and stores the document in the Azure AI Search index for future semantic searches.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated list of technology/product tags (e.g. "azure,kubernetes"). | |
| title | Yes | Document title. | |
| content | Yes | Main content text to index and embed. | |
| entry_type | No | Entry type: workshop, meeting, blog, or repo (default: meeting). | meeting |
| architecture | No | Architecture diagram encoded as JSON or XML. | |
| project_name | No | Name of the associated project. | |
| customer_name | No | Name of the customer or organization. | |
| reference_url | No | External URL reference for the source. | |
| short_summary | No | Brief summary of the content. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the write/non-destructive-add nature and the indexing mechanism, but does not mention error cases (e.g., whether adding a title that already exists overwrites or fails), rate limits, size constraints on content, or what the output/confirmation looks like despite having an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences state the action and purpose without waste. The description is front-loaded with the main verb and resource, and the second sentence adds meaningful mechanistic context about embedding generation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fairly complex 9-parameter write tool with an output schema and 100% parameter coverage, the description covers the core purpose well. Given the output schema exists and the schema documents all params, the main gap is the absence of behavioral caveats (e.g., how duplicate titles are handled, whether content size is limited), but overall it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every one of the 9 parameters has schema-level documentation. The description itself adds no parameter-specific detail beyond what the schema provides, which keeps it at the baseline 3 for full coverage. It doesn't clarify relationships between parameters (e.g., whether short_summary is auto-generated or required for better search).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb+resource ('Add a new document to the project vector database') and clearly explains the mechanism: generates embedding and stores in Azure AI Search. It also distinguishes from the sibling tool 'search_vector_db' by positioning this as the write counterpart (add/produce vs search/query).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what happens (embeds content and stores for future semantic searches) which implies it is used to populate the index before searching. However, it does not explicitly contrast with the sibling search_vector_db tool or mention when NOT to use this tool, nor any prerequisites like needing an index to exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vector_dbA
Search the project vector database using semantic similarity.
Generates a vector embedding for the query and returns the most similar documents from the Azure AI Search index.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language query or reference text to search for. | |
| top_k | No | Number of results to return (default: 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It explains the mechanism (embedding generation, Azure AI Search index) which adds useful context about backend behavior. However, it doesn't disclose details like rate limits, authentication expectations, or behavior when no matches are found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient: a two-sentence first line plus a brief paragraph explaining the mechanism. No wasted words, front-loaded with the core purpose. Could arguably be trimmed but stays within reasonable bounds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (so return format is documented elsewhere) and schema coverage is complete, the description is reasonably complete. It explains the query mechanism and result source. For a simple 2-parameter search tool with an output schema, the description provides sufficient operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description adds the context that 'query' gets embedded, which is a slight enhancement, but top_k semantics are already fully covered by the schema description. Baseline 3 is appropriate since schema handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches a vector database using semantic similarity, specifying it generates embeddings and queries Azure AI Search. It clearly identifies the tool as the search counterpart to its sibling 'search_add_to_vector_db', though it doesn't explicitly contrast itself with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context on what the tool does (semantic search over project vector DB) which implicitly suggests when to use it. However, it doesn't explicitly state when NOT to use it or offer alternatives among siblings (e.g., contrast with search_add_to_vector_db which is for adding, not searching).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_list_sample_workflowsA
List the available sample workflow and agent definitions.
Returns the names, locations, and descriptions of the built-in declarative
YAML files in src/foundry_agents/definitions/ and the available CLI
deployment/run commands.
Example prompts:
"What sample workflows are available?"
"Show me the built-in workflow definitions"
"List the declarative agent templates I can deploy to Foundry"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This is a read-only list operation with no annotations to contradict, and the description communicates a non-destructive purpose clearly ('List...'). It goes beyond a simple verb to describe the specific return contents (names, locations, descriptions, and CLI commands), giving the agent expectation of what output to look for. It doesn't document edge cases like empty definitions or errors, but for a simple listing tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably sized and front-loaded with the core purpose in the first line, then details what's returned, then example prompts. The example prompts add some value for an agent selecting the right tool but could be seen as slightly redundant since the core description is clear. Still, no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema present, so the description needn't explain the return format in detail. The tool is a simple parameterless listing operation with a clear purpose. It's reasonably complete given the low complexity, though it could mention that this is a read-only/inspection operation and whether it requires any special setup or environment context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters and 100% schema coverage (empty schema), so there are no params needing explanation. The baseline for 0 params is 4, and the description appropriately focuses on what's returned rather than parameter handling, which is the right allocation for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'List the available sample workflow and agent definitions' with specific details about what's returned (names, locations, descriptions of YAML files in a specific directory, and available CLI commands). This distinguishes it well from sibling tools like workflows_run_project_log_workflow, which executes workflows rather than listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides example prompts showing exactly when to use this tool ('What sample workflows are available?', 'List the declarative agent templates I can deploy to Foundry'). While it gives clear context for usage, it doesn't explicitly state when NOT to use it or name alternatives, though sibling tools like agents_list_agents are distinguishable from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_run_project_log_workflowA
Run the full project-log ingestion workflow for a Microsoft customer story.
This workflow sequentially invokes two declarative agents:
CaseStudyAgent – fetches the story page and extracts: title, customer name, summary, context, tags, and the source URL.
ArchitectureAgent – generates a structured JSON architecture diagram from the case study context and technology tags.
The combined result is stored as a single entry in the Azure AI Search project-log vector index.
If CaseStudyAgent and ArchitectureAgent have been deployed to
Azure AI Foundry (via deploy-case-study-agent /
deploy-architecture-agent), they are invoked via the Foundry API so
that the run is visible in the project telemetry. Otherwise the same
logic runs locally against Azure OpenAI directly.
| Name | Required | Description | Default |
|---|---|---|---|
| story_url | Yes | URL of a Microsoft customer success story, e.g. https://www.microsoft.com/en/customers/story/25676-commerzbank-ag-azure-ai-foundry-agent-service | |
| project_name | No | Optional project name to tag the log entry with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the orchestration side-effect (writes to Azure AI Search vector index), the deployment-based behavior switch (Foundry API vs local Azure OpenAI), and that the combined result is stored as a single entry. This is meaningful behavioral disclosure beyond what schema captures, though it doesn't specify auth requirements or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with numbered agent steps for readability, making the orchestration flow easy to parse. Every sentence contributes meaningful information. It could be slightly more compact but the markdown structure improves scannability and the length is justified by the workflow complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity (two-step orchestration, deployment-based branching logic, vector-index side effect). The description covers the workflow steps, the storage outcome, and the deployment variance. With an output schema present, the description need not explain return values. It adequately captures the workflow's full scope for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does describe the workflow's inputs implicitly (story_url drives CaseStudyAgent) but doesn't add format or additional semantics beyond what the schema already provides. The description's added value on parameters is minimal but not zero given the top-level workflow context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Run') with a clear resource ('project-log ingestion workflow') and even details the two sequential agent steps (CaseStudyAgent, ArchitectureAgent) plus the final vector-index storage. It clearly distinguishes itself from sibling tools like agents_invoke_agent and index_ingest_project_log by describing the orchestrated multi-step composition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool (running the full project-log workflow). While it doesn't explicitly name alternatives to avoid, it does describe the internal orchestration (agents invoked via Foundry API vs. running locally), which gives context on how it compares to lower-level siblings. It lacks explicit when-not-to-use guidance but provides decent context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
agents_get_invocation_result - First observed
agents_get_invocation_status - First observed
agents_invoke_agent - First observed
agents_list_agents - First observed
index_create_project_log_index - First observed
index_ingest_project_log - First observed
search_add_to_vector_db - First observed
search_vector_db - First observed
workflows_list_sample_workflows - First observed
workflows_run_project_log_workflow
TDQS
Scored across 10 tools
The agents_* and workflows_* tools are fairly distinguishable, but there's notable overlap between index_ingest_project_log and search_add_to_vector_db — both add a document to the same vector index. search_vector_db vs index_* tools are clear, but the ingest/add duplication causes potential misselection.
The server mixes three namespaces: agents_*, index_*, and search_*, each with a verb_noun pattern. However, search_vector_db and search_add_to_vector_db break consistency — one names the action (search) while the other uses search_ as a namespace prefix, so search_* doesn't consistently mean a namespace or an action.
10 tools is a reasonable and well-scoped count for a server handling both agent invocation and vector-database search. Each tool has a clear role in the two primary workflows, though the redundant ingest/add tools pad the count slightly.
The agent workflow covers list/invoke/status/result, which is complete for async invocation. The vector DB side has create-index, ingest, add, and search. Minor gaps exist — there's no delete or update for vector documents, and the result retrieval is separated from status with no explicit error-handling tool — but core lifecycle needs are met.
Maintenance
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Find, vet, and run MCP tools through a secure audited gateway with prompt-injection risk scoring
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Let AI agents query data and act across all your business apps via MCP.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables interaction with Azure AI Foundry services for model exploration, deployment, and performance evaluation. It provides tools for managing knowledge bases via AI Search Service, executing fine-tuning jobs, and orchestrating AI agents through natural language.MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Azure AI Agent Service by automatically discovering agents and creating MCP tools for querying and managing agent workflows.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables file system operations, web scraping, and AI-powered search through MCP tools for use by LLM agents.1-
- AlicenseNot gradedqualityDmaintenanceExposes SAP AI Core APIs as MCP tools, enabling AI assistants to manage AI Core lifecycle and administration through natural language.6MIT