Skip to content

Commit dec8940

Browse files
authored
Merge pull request #25 from perses/ibakshay/add-tools+enhancements
Enable project creation tool in MCP server
2 parents 0c8e2c4 + 7a23c0c commit dec8940

4 files changed

Lines changed: 35 additions & 9 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ To integrate the MCP server with VS Code GitHub Copilot, follow these steps:
157157
| Tool | Description | Required Parameters |
158158
| ---------------------------- | --------------------- | ------------------- |
159159
| `perses_list_projects` | List all projects | - |
160-
| `perses_get_project_by_name` | Get a project by name | `project` |
160+
| `perses_get_project_by_name` | Get a project by name | `project` |
161+
| `perses_create_project` | Create a new project | `project` |
161162

162163
### Dashboards
163164

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func main() {
5656
//Project
5757
mcpServer.AddTool(tools.ListProjects(persesClient))
5858
mcpServer.AddTool(tools.GetProjectByName(persesClient))
59-
// mcpServer.AddTool(tools.CreateProject(persesClient))
59+
mcpServer.AddTool(tools.CreateProject(persesClient))
6060

6161
//Dashboard
6262
mcpServer.AddTool(tools.ListDashboards(persesClient))

pkg/tools/projects.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,30 +33,40 @@ func ListProjects(client apiClient.ClientInterface) (tool mcp.Tool, handler serv
3333
func GetProjectByName(client apiClient.ClientInterface) (tool mcp.Tool, handler server.ToolHandlerFunc) {
3434
return mcp.NewTool("perses_get_project_by_name",
3535
mcp.WithDescription("Get a project by name"),
36-
mcp.WithString("name", mcp.Required(),
36+
mcp.WithString("project", mcp.Required(),
3737
mcp.Description("Project name"))),
3838
func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
39-
name, err := request.RequireString("name")
39+
project, err := request.RequireString("project")
4040
if err != nil {
4141
return mcp.NewToolResultError(err.Error()), nil
4242
}
4343

44-
project, err := client.Project().Get(name)
44+
response, err := client.Project().Get(project)
4545
if err != nil {
46-
return nil, fmt.Errorf("error retrieving project '%s': %w", name, err)
46+
return nil, fmt.Errorf("error retrieving project '%s': %w", project, err)
4747
}
4848

49-
projectJSON, err := json.Marshal(project)
49+
projectJSON, err := json.Marshal(response)
5050
if err != nil {
51-
return nil, fmt.Errorf("error marshalling project '%s': %w", name, err)
51+
return nil, fmt.Errorf("error marshalling project '%s': %w", project, err)
5252
}
5353
return mcp.NewToolResultText(string(projectJSON)), nil
5454
}
5555
}
5656

5757
func CreateProject(client apiClient.ClientInterface) (tool mcp.Tool, handler server.ToolHandlerFunc) {
5858
return mcp.NewTool("perses_create_project",
59-
mcp.WithDescription("Create a new Perses Project"), mcp.WithString("project", mcp.Required())),
59+
mcp.WithDescription("Create a new Perses Project"),
60+
mcp.WithString("project",
61+
mcp.Required(),
62+
mcp.Description("Project name")),
63+
mcp.WithToolAnnotation(mcp.ToolAnnotation{
64+
Title: "Creates a new project in Perses",
65+
ReadOnlyHint: ToBoolPtr(false),
66+
DestructiveHint: ToBoolPtr(false),
67+
IdempotentHint: ToBoolPtr(true),
68+
OpenWorldHint: ToBoolPtr(false),
69+
})),
6070
func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
6171
project, err := request.RequireString("project")
6272
if err != nil {

pkg/tools/utils.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package tools
2+
3+
// ToBoolPtr converts a boolean to a *bool pointer.
4+
func ToBoolPtr(b bool) *bool {
5+
return &b
6+
}
7+
8+
// ToStringPtr converts a string to a *string pointer.
9+
// Returns nil if the string is empty.
10+
func ToStringPtr(s string) *string {
11+
if s == "" {
12+
return nil
13+
}
14+
return &s
15+
}

0 commit comments

Comments
 (0)