Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -186,12 +186,6 @@
# ServiceLabel: %tools-FileShares
# ServiceOwners: @ankushbindlish2 @kszobi

# PRLabel: %tools-Foundry
/tools/Azure.Mcp.Tools.Foundry/ @jayzzh @xiangyan99 @microsoft/azure-mcp

# ServiceLabel: %tools-Foundry
# ServiceOwners: @jayzzh @xiangyan99

# PRLabel: %tools-FunctionApp
/tools/Azure.Mcp.Tools.FunctionApp/ @jongio @microsoft/azure-mcp

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
using Azure.Mcp.Tools.Deploy;
using Azure.Mcp.Tools.EventGrid;
using Azure.Mcp.Tools.Extension;
using Azure.Mcp.Tools.Foundry;
using Azure.Mcp.Tools.FunctionApp;
using Azure.Mcp.Tools.Grafana;
using Azure.Mcp.Tools.KeyVault;
Expand Down Expand Up @@ -73,7 +72,6 @@ public static ICommandFactory CreateCommandFactory(IServiceProvider? serviceProv
new DeploySetup(),
new EventGridSetup(),
new ExtensionSetup(),
new FoundrySetup(),
new FunctionAppSetup(),
new GrafanaSetup(),
new KeyVaultSetup(),
Expand Down Expand Up @@ -137,7 +135,6 @@ public static IServiceCollection SetupCommonServices()
new DeploySetup(),
new EventGridSetup(),
new ExtensionSetup(),
new FoundrySetup(),
new FunctionAppSetup(),
new GrafanaSetup(),
new KeyVaultSetup(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -431,4 +431,71 @@ public async Task DiscoverServersAsync_NamespaceFilteringIsCaseInsensitive()
var serverIds = providers.Select(p => p.CreateMetadata().Id).ToList();
Assert.Contains("documentation", serverIds);
}

[Fact]
public async Task DiscoverServersAsync_FoundryServerIsDiscovered()
{
// Arrange
var strategy = RegistryDiscoveryStrategyHelper.CreateStrategy();

// Act
var result = await strategy.DiscoverServersAsync(TestContext.Current.CancellationToken);
var foundryProvider = result.FirstOrDefault(p => p.CreateMetadata().Name == "foundry");

// Assert
Assert.NotNull(foundryProvider);

var metadata = foundryProvider.CreateMetadata();
Assert.Equal("foundry", metadata.Id);
Assert.Equal("foundry", metadata.Name);
Assert.NotEmpty(metadata.Description);

// Verify description contains key terms
var description = metadata.Description.ToLowerInvariant();
Assert.Contains("foundry", description);
Assert.Contains("mcp", description);
}

[Fact]
public async Task DiscoverServersAsync_FoundryServerHasExpectedProperties()
{
// Arrange
var strategy = RegistryDiscoveryStrategyHelper.CreateStrategy();

// Act
var result = await strategy.DiscoverServersAsync(TestContext.Current.CancellationToken);
var foundryProvider = result.FirstOrDefault(p => p.CreateMetadata().Name == "foundry");

// Assert
Assert.NotNull(foundryProvider);

var metadata = foundryProvider.CreateMetadata();
Assert.Equal("foundry", metadata.Id);
Assert.Equal("foundry", metadata.Name);

// Description should mention models, agents, and evaluation workflows
var description = metadata.Description.ToLowerInvariant();
Assert.Contains("models", description);
Assert.Contains("agents", description);
}

[Fact]
public async Task DiscoverServersAsync_AllExpectedServersArePresent()
{
// Arrange
var strategy = RegistryDiscoveryStrategyHelper.CreateStrategy();

// Act
var result = await strategy.DiscoverServersAsync(TestContext.Current.CancellationToken);
var serverIds = result.Select(p => p.CreateMetadata().Id).ToList();

// Assert
// Verify all expected registry servers are discovered
Assert.Contains("documentation", serverIds);
Assert.Contains("azd", serverIds);
Assert.Contains("foundry", serverIds);

// Should have exactly 3 servers in registry
Assert.Equal(3, serverIds.Count);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -404,39 +404,6 @@
"deploy_plan_get"
]
},
{
"name": "deploy_azure_ai_models",
"description": "Deploy AI models to Microsoft Foundry for machine learning inference and production use.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may delete or modify existing resources in its environment."
},
"idempotent": {
"value": false,
"description": "Running this operation multiple times with the same arguments may have additional effects or produce different results."
},
"openWorld": {
"value": false,
"description": "This tool's domain of interaction is closed and well-defined, limited to a specific set of entities."
},
"readOnly": {
"value": false,
"description": "This tool may modify its environment by creating, updating, or deleting data."
},
"secret": {
"value": false,
"description": "This tool does not handle sensitive or secret information."
},
"localRequired": {
"value": false,
"description": "This tool is available in both local and remote server modes."
}
},
"mappedToolList": [
"foundry_models_deploy"
]
},
{
"name": "get_azure_app_config_settings",
"description": "Get details about Azure App Configuration settings",
Expand Down Expand Up @@ -1040,7 +1007,7 @@
},
{
"name": "get_azure_best_practices",
"description": "Retrieve Azure best practices and infrastructure schema for code generation, deployment, and operations. Covers general Azure practices, Azure Functions best practices, AI app development best practices, Terraform configurations, Bicep template schemas, deployment best practices and Microsoft Foundry sdk code samples.",
"description": "Retrieve Azure best practices and infrastructure schema for code generation, deployment, and operations. Covers general Azure practices, Azure Functions best practices, AI app development best practices, Terraform configurations, Bicep template schemas, and deployment best practices.",
"toolMetadata": {
"destructive": {
"value": false,
Expand Down Expand Up @@ -1071,8 +1038,7 @@
"azureterraformbestpractices_get",
"bicepschema_get",
"get_azure_bestpractices_ai_app",
"get_azure_bestpractices_get",
"foundry_agents_get-sdk-sample"
"get_azure_bestpractices_get"
]
},
{
Expand Down Expand Up @@ -1181,7 +1147,7 @@
},
{
"name": "get_azure_ai_resources_details",
"description": "Get details about Azure AI resources including listing and querying AI Search services, listing models available to be deployed and models deployed already, knowledge index schema by Microsoft Foundry, knowledge base and source information, and listing Microsoft Foundry , threads, messages and resources.",
"description": "Get details about Azure AI resources including listing and querying AI Search services, knowledge base and source information.",
"toolMetadata": {
"destructive": {
"value": false,
Expand Down Expand Up @@ -1213,16 +1179,7 @@
"search_index_get",
"search_index_query",
"search_knowledge_source_get",
"search_knowledge_base_get",
"foundry_models_deployments_list",
"foundry_models_list",
"foundry_knowledge_index_list",
"foundry_knowledge_index_schema",
"foundry_openai_models-list",
"foundry_agents_list",
"foundry_resource_get",
"foundry_threads_list",
"foundry_threads_get-messages"
"search_knowledge_base_get"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
"title": "Azure Developer CLI",
"description": "Azure Developer CLI (azd) includes a suite of tools to help build, modernize, and manage applications on Azure. It simplifies the process of developing cloud applications by providing commands for project initialization, resource provisioning, deployment, and monitoring. Use this tool to streamline your Azure development workflow and manage your cloud resources efficiently.",
"installInstructions": "The Azure Developer CLI (azd) is either not installed or requires an update. The minimum required version that works with MCP tools is 1.20.0.\n\nTo install or upgrade, follow the instructions at https://aka.ms/azd/install\n\nAfter installation you may need to restart the Azure MCP server and your IDE."
},
"foundry": {
"url": "https://mcp.ai.azure.com",
"title": "Microsoft Foundry MCP",
"description": "MCP server with tools to read, create, modify resources such as Models, Agents and Evaluation workflows in Microsoft Foundry platform.",
"oauthScopes": ["https://mcp.ai.azure.com/Foundry.Mcp.Tools"]
}
}
}
151 changes: 2 additions & 149 deletions servers/Azure.Mcp.Server/docs/azmcp-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -1512,14 +1512,13 @@ azmcp get azure bestpractices get --resource <resource> --action <action>
# deployment - Best practices for deployment (for general and azurefunctions)

# Get best practices for building AI applications, workflows and agents in Azure
# Call this before generating code for any AI application, building with Microsoft Foundry models,
# working with Microsoft Agent Framework, or implementing AI solutions in Azure.
# Call this before generating code for any AI application, working with Microsoft Agent Framework,
# or implementing AI solutions in Azure.
azmcp get azure bestpractices ai_app

# AI App Development:
# ai_app - Comprehensive guidance for AI applications including:
# • Microsoft Agent Framework usage and patterns
# • Microsoft Foundry model selection
# • Best practices for AI app/agent development in Azure
```

Expand Down Expand Up @@ -2715,152 +2714,6 @@ azmcp cloudarchitect design --question "What type of application are you buildin
--confidence-score 0.1
```

### Microsoft Foundry Operations

```bash
# Create an agent in a Microsoft Foundry project
# ❌ Destructive | ❌ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents create --endpoint <endpoint> \
--model-deployment <model-deployment> \
--agent-name <agent-name> \
--systemInstruction <system-instruction>

# Connect to an agent in a Microsoft Foundry project and query it
# ❌ Destructive | ❌ Idempotent | ✅ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents connect --agent-id <agent-id> \
--query <query> \
--endpoint <endpoint>

# Evaluate a response from an agent by passing query and response inline
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents evaluate --agent-id <agent-id> \
--query <query> \
--response <response> \
--evaluator <evaluator> \
--azure-openai-endpoint <azure-openai-endpoint> \
--azure-openai-deployment <azure-openai-deployment> \
[--tool-definitions <tool-definitions>]

# Get SDK samples for interacting with a Microsoft Foundry agent
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents get-sdk-sample --programming-language <python|typescript|csharp>

# List all Azure AI Agents available in the configured project
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents list --endpoint <endpoint>

# Query and evaluate an agent in one command
# ❌ Destructive | ❌ Idempotent | ✅ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry agents query-and-evaluate --agent-id <agent-id> \
--query <query> \
--endpoint <endpoint> \
--azure-openai-endpoint <azure-openai-endpoint> \
--azure-openai-deployment <azure-openai-deployment> \
[--evaluators <evaluators>]

# List knowledge indexes in a Microsoft Foundry project
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry knowledge index list --endpoint <endpoint>

# Get knowledge index schema information
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry knowledge index schema --endpoint <endpoint> \
--index <index>

# Deploy a Microsoft Foundry model
# ✅ Destructive | ❌ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry models deploy --subscription <subscription> \
--resource-group <resource-group> \
--deployment <deployment> \
--model-name <model> \
--model-format <model-format> \
--azure-ai-services <azure-ai-services> \
[--model-version <model-version>] \
[--model-source <model-source>] \
[--sku <sku>] \
[--sku-capacity <sku-capacity>] \
[--scale-type <scale-type>] \
[--scale-capacity <scale-capacity>]

# List Microsoft Foundry model deployments
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry models deployments list --endpoint <endpoint>

# List Microsoft Foundry models
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry models list [--search-for-free-playground <search-for-free-playground>] \
[--publisher <publisher>] \
[--license <license>] \
[--model-name <model>]

# Create interactive chat completions using Azure OpenAI chat models
# ❌ Destructive | ❌ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry openai chat-completions-create --subscription <subscription> \
--resource-group <resource-group> \
--resource-name <resource-name> \
--deployment <deployment-name> \
--message-array <message-array> \
[--max-tokens <max-tokens>] \
[--temperature <temperature>] \
[--top-p <top-p>] \
[--frequency-penalty <frequency-penalty>] \
[--presence-penalty <presence-penalty>] \
[--stop <stop-sequences>] \
[--stream <stream>] \
[--seed <seed>] \
[--user <user>] \
[--auth-method <auth-method>]

# Generate text completions using deployed Azure OpenAI models in Microsoft Foundry
# ❌ Destructive | ❌ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry openai create-completion --subscription <subscription> \
--resource-group <resource-group> \
--resource-name <resource-name> \
--deployment <deployment-name> \
--prompt-text <prompt-text> \
[--max-tokens <max-tokens>] \
[--temperature <temperature>]

# Generate vector embeddings for text using Azure OpenAI embedding models
# ❌ Destructive | ❌ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry openai embeddings-create --subscription <subscription> \
--resource-group <resource-group> \
--resource-name <resource-name> \
--deployment <deployment-name> \
--input-text <input-text> \
[--user <user>] \
[--encoding-format <encoding-format>] \
[--dimensions <dimensions>] \
[--auth-method <auth-method>]

# List all available OpenAI models and deployments in an Azure resource
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry openai models-list --subscription <subscription> \
--resource-group <resource-group> \
--resource-name <resource-name> \
[--auth-method <auth-method>]

# Get Microsoft Foundry (Cognitive Services) resource details
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry resource get --subscription <subscription> \
[--resource-group <resource-group>] \
[--resource-name <resource-name>]

# Create a Microsoft Foundry agent thread
# ❌ Destructive | ❌ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry threads create --endpoint <endpoint>
--user-message <user-message>

# Get messages of a Microsoft Foundry agent thread
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry threads get-messages --endpoint <endpoint>
--thread-id <thread-id>

# List Microsoft Foundry agent threads in a Foundry project
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp foundry threads list --endpoint <endpoint>
```

## Response Format

All responses follow a consistent JSON format:
Expand Down
1 change: 0 additions & 1 deletion servers/Azure.Mcp.Server/src/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ private static IAreaSetup[] RegisterAreas()
new Azure.Mcp.Tools.ConfidentialLedger.ConfidentialLedgerSetup(),
new Azure.Mcp.Tools.EventHubs.EventHubsSetup(),
new Azure.Mcp.Tools.FileShares.FileSharesSetup(),
new Azure.Mcp.Tools.Foundry.FoundrySetup(),
new Azure.Mcp.Tools.FunctionApp.FunctionAppSetup(),
new Azure.Mcp.Tools.Grafana.GrafanaSetup(),
new Azure.Mcp.Tools.KeyVault.KeyVaultSetup(),
Expand Down
7 changes: 0 additions & 7 deletions tools/Azure.Mcp.Tools.Foundry/src/AssemblyInfo.cs

This file was deleted.

Loading
Loading