Skip to main content
Glama
denniszielke

Foundry Agents MCP Server

by denniszielke

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 uvx or VS Code Copilot

  • HTTP – 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 configuration

Related MCP server: Azure AI Foundry Agent MCP

MCP tool namespaces

Namespace

Tools

agents_*

List agents · Invoke agent · Check status · Get result

search_*

Semantic vector search · Add document to vector DB

index_*

Create project-log index · Ingest project log entry

workflows_*

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-server

Or with an explicit environment file:

uvx --from git+https://github.com/denniszielke/foundry-agents-mcp-server@main --env-file .env foundry-agents-mcp-server

Configuration

All configuration is driven by environment variables. Copy .env.sample to .env and fill in your values.

Variable

Required

Description

AZURE_AI_PROJECT_ENDPOINT

For agent tools

AI Foundry project endpoint – https://<account>.services.ai.azure.com/api/projects/<project>

AZURE_OPENAI_ENDPOINT

No

OpenAI-compatible endpoint (falls back to AZURE_AI_PROJECT_ENDPOINT)

AZURE_OPENAI_COMPLETION_MODEL_NAME

For workflow tools

Completion model deployment name in the Foundry account

AZURE_OPENAI_EMBEDDING_MODEL

For search/index tools

Embedding model deployment name (default: text-embedding-3-small)

AZURE_OPENAI_EMBEDDING_DIMENSIONS

No

Embedding vector size (default: 1536)

AZURE_AI_SEARCH_ENDPOINT

For search/index tools

Azure AI Search service endpoint URL

AZURE_AI_SEARCH_INDEX_NAME

No

Search index name (default: project-log-index)

APPLICATIONINSIGHTS_CONNECTION_STRING

No

Application Insights connection string for telemetry

Note – When deploying via azd up, all these values are written to .env automatically by infra/write_env.sh. For local development run az login and use DefaultAzureCredential; 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

agent_id

string

Agent ID from agents_list_agents

task

string

Task description or question

file_context

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

invocation_id

string

Invocation ID from agents_invoke_agent

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

invocation_id

string

Invocation ID from agents_invoke_agent

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

query

string

Natural language search query

top_k

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

title

string

Document title

content

string

Main text to embed and index

entry_type

string (optional)

workshop, meeting, blog, or repo (default: meeting)

customer_name

string (optional)

Customer or organization name

short_summary

string (optional)

Brief summary

project_name

string (optional)

Associated project name

tags

string (optional)

Comma-separated tags (e.g. "azure,kubernetes")

reference_url

string (optional)

Source URL

architecture

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

id

String (key)

Auto-generated UUID

title

String

Searchable, filterable, sortable

type

String

Filterable, facetable (workshop, meeting, blog, repo)

customer_name

String

Filterable, facetable

short_summary

String

Searchable

context

String

Searchable (full body text)

context_vector

Collection(Single)

HNSW vector search field

project_name

String

Filterable, facetable

tags

Collection(String)

Filterable, facetable

reference_url

String

Searchable

architecture

String

Searchable

creation_date

DateTimeOffset

Filterable, sortable

modified_date

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

title

string

Log entry title

entry_type

string

workshop, meeting, blog, or repo

customer_name

string

Customer or organization name

short_summary

string

Brief summary (1–2 sentences)

context

string

Full context text (will be embedded)

project_name

string (optional)

Project name

tags

string (optional)

Comma-separated tags

reference_url

string (optional)

Source URL

architecture

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 ArchitectureAgent

Run 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 USE_PRIVATE_INGRESS=true for internal-only access

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 Contributor

Quick 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 up

azd up will:

  1. Provision all resources (VNet, Container Apps, Foundry, Search, monitoring)

  2. Run infra/write_env.sh to populate .env with 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 name

The script will:

  1. Build the Docker image remotely in ACR via az acr build

  2. Deploy the Container App via a Bicep deployment (infra/app/server.bicep)

  3. 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_URL
  1. Open Command Palette in VS Code → MCP: Add ServerHTTP.

  2. Enter the URL from .env (e.g. https://<app-fqdn>/mcp).

  3. 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 portal

Tear down

azd down

Development

# 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_mcp

License

MIT

Available Tools

10 tools
agents_get_invocation_resultA

Retrieve the text or file results from a completed agent or workflow invocation.

ParametersJSON Schema
NameRequiredDescriptionDefault
invocation_idYesThe invocation ID returned by agents_invoke_agent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
invocation_idYesThe invocation ID returned by agents_invoke_agent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesThe task description or question to send to the agent.
agent_idYesThe ID of the agent or workflow to invoke (from agents_list_agents).
file_contextNoOptional additional text or file content to include as context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoComma-separated technology/product tags (e.g. "azure,kubernetes,devops").
titleYesTitle of the project log entry.
contextYesFull context or body text (will be vectorized for search).
entry_typeYesEntry type: workshop, meeting, blog, or repo.
architectureNoArchitecture diagram as JSON or XML string.
project_nameNoProject name for filtering/faceting.
customer_nameYesCustomer or organization name.
reference_urlNoExternal source URL.
short_summaryYesBrief summary (1–2 sentences).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoComma-separated list of technology/product tags (e.g. "azure,kubernetes").
titleYesDocument title.
contentYesMain content text to index and embed.
entry_typeNoEntry type: workshop, meeting, blog, or repo (default: meeting).meeting
architectureNoArchitecture diagram encoded as JSON or XML.
project_nameNoName of the associated project.
customer_nameNoName of the customer or organization.
reference_urlNoExternal URL reference for the source.
short_summaryNoBrief summary of the content.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural language query or reference text to search for.
top_kNoNumber of results to return (default: 5).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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:

  1. CaseStudyAgent – fetches the story page and extracts: title, customer name, summary, context, tags, and the source URL.

  2. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
story_urlYesURL of a Microsoft customer success story, e.g. https://www.microsoft.com/en/customers/story/25676-commerzbank-ag-azure-ai-foundry-agent-service
project_nameNoOptional project name to tag the log entry with.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 10 tool updatesv0.1.0
    • First observedagents_get_invocation_result
    • First observedagents_get_invocation_status
    • First observedagents_invoke_agent
    • First observedagents_list_agents
    • First observedindex_create_project_log_index
    • First observedindex_ingest_project_log
    • First observedsearch_add_to_vector_db
    • First observedsearch_vector_db
    • First observedworkflows_list_sample_workflows
    • First observedworkflows_run_project_log_workflow

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers