Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ temp/
# Scripts
scripts/
.ragcode/
.agent/skills/
.agent/
.trello.json
build-binaries.sh

# Debug logs
Expand Down
6 changes: 6 additions & 0 deletions internal/daemon/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import (
"github.com/doITmagic/rag-code-mcp/internal/healthcheck"
"github.com/doITmagic/rag-code-mcp/internal/logger"
"github.com/doITmagic/rag-code-mcp/internal/service/engine"
"github.com/doITmagic/rag-code-mcp/internal/service/prompts"
"github.com/doITmagic/rag-code-mcp/internal/service/resources"
"github.com/doITmagic/rag-code-mcp/internal/service/search"
"github.com/doITmagic/rag-code-mcp/internal/service/tools"
"github.com/doITmagic/rag-code-mcp/internal/transport"
Expand Down Expand Up @@ -173,6 +175,10 @@ func Run(rcfg RunConfig) error {
logger.Instance.Info("Update tools registered (auto_update=false)")
}

// Register MCP Resources & Prompts (MVP)
resources.Register(mcpServer, eng)
prompts.Register(mcpServer, eng)

logger.Instance.Info("MCP RagCode Daemon initialized (version=%s)", rcfg.Version)

if cfg.AutoUpdate {
Expand Down
41 changes: 41 additions & 0 deletions internal/service/prompts/prompts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package prompts

import (
"context"
"fmt"

"github.com/doITmagic/rag-code-mcp/internal/service/engine"
"github.com/modelcontextprotocol/go-sdk/mcp"
)

// Register registers all MCP prompts provided by this package on the given mcp.Server.
func Register(mcpServer *mcp.Server, eng *engine.Engine) {
mcpServer.AddPrompt(&mcp.Prompt{
Name: "System Diagnostics",
Description: "Analyze the current indexing status and troubleshoot common issues based on the workspace resources.",
Title: "Analyze RagCode Indexing System",
}, func(ctx context.Context, _ *mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {
// Same detection as Resources: auto-detect workspace via ctx, no custom logic.
wctx, err := eng.DetectContext(ctx, "")
if err != nil {
return nil, fmt.Errorf("failed to detect workspace: %w", err)
}

promptText := fmt.Sprintf(`Please analyze the current indexing status of the RagCode MCP server for the workspace located at: %s

You can inspect the indexing status by reading the resource directly via URI: "ragcode://status/indexing" or using your available tools.
Then, inform me if there are any issues such as stuck processes or parsing errors.`, wctx.Root)

return &mcp.GetPromptResult{
Description: "Prompt to diagnose indexing and execution issues automatically.",
Messages: []*mcp.PromptMessage{
{
Role: mcp.Role("user"),
Content: &mcp.TextContent{
Text: promptText,
},
},
},
}, nil
})
}
50 changes: 50 additions & 0 deletions internal/service/resources/resources.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package resources

import (
"context"
"encoding/json"
"fmt"

"github.com/doITmagic/rag-code-mcp/internal/service/engine"
"github.com/modelcontextprotocol/go-sdk/mcp"
)

// Register registers all MCP resources provided by this package on the given mcp.Server.
func Register(mcpServer *mcp.Server, eng *engine.Engine) {
mcpServer.AddResource(&mcp.Resource{
URI: "ragcode://status/indexing",
Name: "Indexing Status",
Description: "Returns the current indexing status and progress for the workspace.",
MIMEType: "application/json",
}, func(ctx context.Context, request *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
// Same detection mechanism used by all existing tools.
// Middleware in run.go reads X-Workspace-Root from the HTTP header into ctx,
// and DetectContext picks it up automatically via Tier 2 (transport.GetWorkspaceHint).
wctx, err := eng.DetectContext(ctx, "")
if err != nil {
return nil, fmt.Errorf("failed to detect workspace: %w", err)
}

// GetIndexStatus reads from the on-disk index_status.json,
// thread-safe against the indexer writing concurrently.
status := eng.GetIndexStatus(wctx.Root)
if status == nil {
return nil, fmt.Errorf("index status not found for workspace %s", wctx.Root)
}

blob, err := json.MarshalIndent(status, "", " ")
if err != nil {
return nil, fmt.Errorf("failed to marshal index status: %w", err)
}

return &mcp.ReadResourceResult{
Contents: []*mcp.ResourceContents{
{
URI: request.Params.URI,
MIMEType: "application/json",
Text: string(blob),
},
},
}, nil
})
}
Loading