diff --git a/.github/workflow-gen/Program.cs b/.github/workflow-gen/Program.cs
index 4a716aa32..af73a335c 100644
--- a/.github/workflow-gen/Program.cs
+++ b/.github/workflow-gen/Program.cs
@@ -17,6 +17,11 @@ var products = new Product[]
"bff",
["Bff.Tests"],
["Hosts.Tests"]),
+ new("docs-mcp",
+ "docs-mcp.slnf",
+ "dmcp",
+ [],
+ []),
new("identity-server",
"identity-server.slnf",
"is",
diff --git a/.github/workflows/aspnetcore-authentication-jwtbearer-ci.yml b/.github/workflows/aspnetcore-authentication-jwtbearer-ci.yml
index 09ceffd82..1bc2136ea 100644
--- a/.github/workflows/aspnetcore-authentication-jwtbearer-ci.yml
+++ b/.github/workflows/aspnetcore-authentication-jwtbearer-ci.yml
@@ -128,8 +128,7 @@ jobs:
fetch-depth: 0
codeql:
name: CodeQL analyze
- # Remove once https://github.com/github/codeql-action/issues/3207#issuecomment-3405956414 has been resolved
- if: false && ((github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch'))
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
runs-on:
group: large
labels: [ubuntu-latest-x64-16core]
@@ -148,7 +147,6 @@ jobs:
languages: csharp
build-mode: manual
db-location: ~/.codeql/databases
- debug: true
- name: List .net sdks
run: dotnet --list-sdks
- name: Setup Dotnet
@@ -161,7 +159,7 @@ jobs:
- name: Restore
run: dotnet restore aspnetcore-authentication-jwtbearer.slnf
- name: Build
- run: dotnet build aspnetcore-authentication-jwtbearer.slnf --no-restore --no-incremental -c Release
+ run: dotnet build aspnetcore-authentication-jwtbearer.slnf --no-restore -c Release
- name: Perform CodeQL Analysis
if: ${{ env.DISABLE_CODEQL_ANALYSIS != 'true' }}
uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0
diff --git a/.github/workflows/docs-mcp-ci.yml b/.github/workflows/docs-mcp-ci.yml
new file mode 100644
index 000000000..1f4cf98e6
--- /dev/null
+++ b/.github/workflows/docs-mcp-ci.yml
@@ -0,0 +1,211 @@
+# This was generated by tool. Edits will be overwritten.
+
+name: docs-mcp/ci
+on:
+ workflow_dispatch:
+ push:
+ paths:
+ - .config/dotnet-tools.json
+ - .github/workflows/docs-mcp-**
+ - docs-mcp/**
+ - .editorconfig
+ - Directory.Packages.props
+ - global.json
+ - src.props
+ - test.props
+ pull_request:
+ paths:
+ - .config/dotnet-tools.json
+ - .github/workflows/docs-mcp-**
+ - docs-mcp/**
+ - .editorconfig
+ - Directory.Packages.props
+ - global.json
+ - src.props
+ - test.props
+env:
+ DOTNET_NOLOGO: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+jobs:
+ verify-formatting:
+ name: Verify formatting
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
+ runs-on:
+ group: large
+ labels: [ubuntu-latest-x64-16core]
+ permissions:
+ contents: read
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: Restore
+ run: dotnet restore docs-mcp.slnf
+ - name: Verify Formatting
+ run: dotnet format docs-mcp.slnf --verify-no-changes --no-restore
+ build:
+ name: Build and test (unit)
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ checks: write
+ contents: read
+ packages: write
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: Restore
+ run: dotnet restore docs-mcp.slnf
+ - name: Build
+ run: dotnet build docs-mcp.slnf --no-restore -c Release
+ - name: Dotnet devcerts
+ run: dotnet dev-certs https --trust
+ playwright:
+ name: Playwright tests
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
+ runs-on:
+ group: large
+ labels: [ubuntu-latest-x64-16core]
+ permissions:
+ actions: read
+ checks: write
+ contents: read
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ codeql:
+ name: CodeQL analyze
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
+ runs-on:
+ group: large
+ labels: [ubuntu-latest-x64-16core]
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0
+ with:
+ languages: csharp
+ build-mode: manual
+ db-location: ~/.codeql/databases
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: Restore
+ run: dotnet restore docs-mcp.slnf
+ - name: Build
+ run: dotnet build docs-mcp.slnf --no-restore -c Release
+ - name: Perform CodeQL Analysis
+ if: ${{ env.DISABLE_CODEQL_ANALYSIS != 'true' }}
+ uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0
+ with:
+ category: /language:csharp
+ pack:
+ name: Pack, sign and push
+ if: (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) || (github.event_name == 'push') || (github.event_name == 'workflow_dispatch')
+ needs:
+ - verify-formatting
+ - build
+ - playwright
+ - codeql
+ runs-on:
+ group: large
+ labels: [ubuntu-latest-x64-16core]
+ permissions:
+ actions: read
+ contents: read
+ packages: write
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: Tool restore
+ run: dotnet tool restore
+ - name: Pack docs-mcp.slnf
+ run: dotnet pack -c Release docs-mcp.slnf -o artifacts
+ - name: Sign packages
+ if: github.event == 'push'
+ run: |-
+ for file in artifacts/*.nupkg; do
+ dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigninghsm.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate NuGetPackageSigning
+ done
+ - name: Push packages to GitHub
+ if: github.ref == 'refs/heads/main'
+ run: dotnet nuget push artifacts/*.nupkg --source https://nuget.pkg.github.com/DuendeSoftware/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Upload Artifacts
+ if: github.ref == 'refs/heads/main'
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
+ with:
+ name: artifacts
+ path: docs-mcp/artifacts/*.nupkg
+ overwrite: true
+ retention-days: 15
diff --git a/.github/workflows/docs-mcp-release.yml b/.github/workflows/docs-mcp-release.yml
new file mode 100644
index 000000000..502327540
--- /dev/null
+++ b/.github/workflows/docs-mcp-release.yml
@@ -0,0 +1,118 @@
+# This was generated by tool. Edits will be overwritten.
+
+name: docs-mcp/release
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Version in format X.Y.Z, X.Y.Z-preview.N, or X.Y.Z-rc.N'
+ type: string
+ required: true
+ default: '0.0.0'
+ branch:
+ description: '(Optional) the name of the branch to release from'
+ type: string
+ required: false
+ default: 'main'
+ remove-tag-if-exists:
+ description: 'If set, will remove the existing tag. Use this if you have issues with the previous release action'
+ type: boolean
+ required: false
+ default: false
+env:
+ DOTNET_NOLOGO: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+jobs:
+ tag:
+ name: Tag and Pack
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ packages: write
+ defaults:
+ run:
+ shell: bash
+ working-directory: docs-mcp
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Validate Version Input
+ run: echo '${{ github.event.inputs.version }}' | grep -P '^\d+\.\d+\.\d+(-preview\.\d+|-rc\.\d+)?$' || (echo 'Invalid version format' && exit 1)
+ - name: Checkout target branch
+ if: github.event.inputs.branch != 'main'
+ run: git checkout ${{ github.event.inputs.branch }}
+ - name: Git Config
+ run: |-
+ git config --global user.email "github-bot@duendesoftware.com"
+ git config --global user.name "Duende Software GitHub Bot"
+ - name: Git Config
+ if: github.event.inputs['remove-tag-if-exists'] == 'true'
+ run: |-
+ if git rev-parse dmcp-${{ github.event.inputs.version }} >/dev/null 2>&1; then
+ git tag -d dmcp-${{ github.event.inputs.version }}
+ git push --delete origin dmcp-${{ github.event.inputs.version }}
+ else
+ echo 'Tag dmcp-${{ github.event.inputs.version }} does not exist.'
+ fi
+ - name: Git Config
+ run: |-
+ git tag -a dmcp-${{ github.event.inputs.version }} -m "Release v${{ github.event.inputs.version }}"
+ git push origin dmcp-${{ github.event.inputs.version }}
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: Pack docs-mcp.slnf
+ run: dotnet pack -c Release docs-mcp.slnf -o artifacts
+ - name: Tool restore
+ run: dotnet tool restore
+ - name: Sign packages
+ run: |-
+ for file in artifacts/*.nupkg; do
+ dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigninghsm.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate NuGetPackageSigning
+ done
+ - name: Push packages to GitHub
+ run: dotnet nuget push artifacts/*.nupkg --source https://nuget.pkg.github.com/DuendeSoftware/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
+ with:
+ name: artifacts
+ path: docs-mcp/artifacts/*.nupkg
+ overwrite: true
+ retention-days: 15
+ publish:
+ name: Publish to nuget.org
+ needs:
+ - tag
+ runs-on: ubuntu-latest
+ environment:
+ name: nuget.org
+ steps:
+ - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
+ with:
+ name: artifacts
+ path: artifacts
+ - name: List .net sdks
+ run: dotnet --list-sdks
+ - name: Setup Dotnet
+ uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25
+ with:
+ dotnet-version: |-
+ 8.0.x
+ 9.0.203
+ 10.0.100-rc.2.25502.107
+ - name: List files
+ run: tree
+ shell: bash
+ - name: Push packages to nuget.org
+ run: dotnet nuget push artifacts/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_ORG_API_KEY }} --skip-duplicate
diff --git a/docs-mcp/Duende.Documentation.Mcp.sln b/docs-mcp/Duende.Documentation.Mcp.sln
deleted file mode 100644
index f1b919720..000000000
--- a/docs-mcp/Duende.Documentation.Mcp.sln
+++ /dev/null
@@ -1,29 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duende.Documentation.Mcp.Server", "src\Duende.Documentation.Mcp.Server\Duende.Documentation.Mcp.Server.csproj", "{77ABDCC6-CE90-48DB-92F9-C5196A4A703A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_", "_", "{043ECBC2-3F36-41B3-97FA-B89C91ECEEF8}"
- ProjectSection(SolutionItems) = preProject
- README.md = README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".config", ".config", "{67AE9E59-B4E8-4D11-BA48-2228BFB217D6}"
- ProjectSection(SolutionItems) = preProject
- .config\dotnet-tools.json = .config\dotnet-tools.json
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {77ABDCC6-CE90-48DB-92F9-C5196A4A703A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {77ABDCC6-CE90-48DB-92F9-C5196A4A703A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {77ABDCC6-CE90-48DB-92F9-C5196A4A703A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {77ABDCC6-CE90-48DB-92F9-C5196A4A703A}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {67AE9E59-B4E8-4D11-BA48-2228BFB217D6} = {043ECBC2-3F36-41B3-97FA-B89C91ECEEF8}
- EndGlobalSection
-EndGlobal
diff --git a/docs-mcp/docs-mcp.slnf b/docs-mcp/docs-mcp.slnf
new file mode 100644
index 000000000..8109abb80
--- /dev/null
+++ b/docs-mcp/docs-mcp.slnf
@@ -0,0 +1,9 @@
+{
+ "solution": {
+ "path": "..\\products.slnx",
+ "projects": [
+ ".github\\workflow-gen\\workflow-gen.csproj",
+ "docs-mcp\\src\\Documentation.Mcp\\Documentation.Mcp.csproj"
+ ]
+ }
+}
diff --git a/docs-mcp/src/Directory.Build.props b/docs-mcp/src/Directory.Build.props
index a8d593a3e..41038d22a 100644
--- a/docs-mcp/src/Directory.Build.props
+++ b/docs-mcp/src/Directory.Build.props
@@ -7,7 +7,7 @@
All
OAuth 2.0;OpenID Connect;Security;Identity;IdentityServer;ASP.NET Core
Duende Documentation MCP Server
- mcp-
+ dmcp-
1.0
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSBlogArticle.cs b/docs-mcp/src/Documentation.Mcp/Database/FTSBlogArticle.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSBlogArticle.cs
rename to docs-mcp/src/Documentation.Mcp/Database/FTSBlogArticle.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSDocsArticle.cs b/docs-mcp/src/Documentation.Mcp/Database/FTSDocsArticle.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSDocsArticle.cs
rename to docs-mcp/src/Documentation.Mcp/Database/FTSDocsArticle.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSSampleProject.cs b/docs-mcp/src/Documentation.Mcp/Database/FTSSampleProject.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/FTSSampleProject.cs
rename to docs-mcp/src/Documentation.Mcp/Database/FTSSampleProject.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/McpDb.cs b/docs-mcp/src/Documentation.Mcp/Database/McpDb.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/McpDb.cs
rename to docs-mcp/src/Documentation.Mcp/Database/McpDb.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/20250828191400_Initial.Designer.cs b/docs-mcp/src/Documentation.Mcp/Database/Migrations/20250828191400_Initial.Designer.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/20250828191400_Initial.Designer.cs
rename to docs-mcp/src/Documentation.Mcp/Database/Migrations/20250828191400_Initial.Designer.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/20250828191400_Initial.cs b/docs-mcp/src/Documentation.Mcp/Database/Migrations/20250828191400_Initial.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/20250828191400_Initial.cs
rename to docs-mcp/src/Documentation.Mcp/Database/Migrations/20250828191400_Initial.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/McpDbModelSnapshot.cs b/docs-mcp/src/Documentation.Mcp/Database/Migrations/McpDbModelSnapshot.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/Migrations/McpDbModelSnapshot.cs
rename to docs-mcp/src/Documentation.Mcp/Database/Migrations/McpDbModelSnapshot.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Database/State.cs b/docs-mcp/src/Documentation.Mcp/Database/State.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Database/State.cs
rename to docs-mcp/src/Documentation.Mcp/Database/State.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Duende.Documentation.Mcp.Server.csproj b/docs-mcp/src/Documentation.Mcp/Documentation.Mcp.csproj
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Duende.Documentation.Mcp.Server.csproj
rename to docs-mcp/src/Documentation.Mcp/Documentation.Mcp.csproj
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Infrastructure/TemporaryFileStream.cs b/docs-mcp/src/Documentation.Mcp/Infrastructure/TemporaryFileStream.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Infrastructure/TemporaryFileStream.cs
rename to docs-mcp/src/Documentation.Mcp/Infrastructure/TemporaryFileStream.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Program.cs b/docs-mcp/src/Documentation.Mcp/Program.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Program.cs
rename to docs-mcp/src/Documentation.Mcp/Program.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Properties/launchSettings.json b/docs-mcp/src/Documentation.Mcp/Properties/launchSettings.json
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Properties/launchSettings.json
rename to docs-mcp/src/Documentation.Mcp/Properties/launchSettings.json
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Blog/BlogArticleIndexer.cs b/docs-mcp/src/Documentation.Mcp/Sources/Blog/BlogArticleIndexer.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Blog/BlogArticleIndexer.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Blog/BlogArticleIndexer.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Blog/BlogSearchTool.cs b/docs-mcp/src/Documentation.Mcp/Sources/Blog/BlogSearchTool.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Blog/BlogSearchTool.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Blog/BlogSearchTool.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Docs/DocsArticleIndexer.cs b/docs-mcp/src/Documentation.Mcp/Sources/Docs/DocsArticleIndexer.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Docs/DocsArticleIndexer.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Docs/DocsArticleIndexer.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Docs/DocsSearchTool.cs b/docs-mcp/src/Documentation.Mcp/Sources/Docs/DocsSearchTool.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Docs/DocsSearchTool.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Docs/DocsSearchTool.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Samples/SamplesIndexer.cs b/docs-mcp/src/Documentation.Mcp/Sources/Samples/SamplesIndexer.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Samples/SamplesIndexer.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Samples/SamplesIndexer.cs
diff --git a/docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Samples/SamplesSearchTool.cs b/docs-mcp/src/Documentation.Mcp/Sources/Samples/SamplesSearchTool.cs
similarity index 100%
rename from docs-mcp/src/Duende.Documentation.Mcp.Server/Sources/Samples/SamplesSearchTool.cs
rename to docs-mcp/src/Documentation.Mcp/Sources/Samples/SamplesSearchTool.cs
diff --git a/products.slnx b/products.slnx
index f73fdc757..e4a060213 100644
--- a/products.slnx
+++ b/products.slnx
@@ -74,7 +74,7 @@
-
+