compare

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 23, 2025 License: AGPL-3.0 Imports: 14 Imported by: 0

README

xk6-mcp

A k6 extension for testing Model Context Protocol (MCP) servers.

[!CAUTION] This extension is experimental and not officially supported by Grafana Labs.

Installation

  1. First, ensure you have xk6 installed:
go install go.k6.io/xk6/cmd/xk6@latest
  1. Build a k6 binary with the xk6-mcp extension:
xk6 build --with github.com/dgzlopes/xk6-mcp
  1. Import the mcp module in your script, at the top of your test script:
import mcp from 'k6/x/mcp';
  1. The built binary will be in your current directory. You can move it to your PATH or use it directly:
./k6 run script.js

Example

⚠️ This example depends on mcp-example-server
You can download the latest version from the releases page.

import mcp from 'k6/x/mcp';

export default function () {
  // Initialize MCP Client with stdio transport
  const client = new mcp.StdioClient({
    path: './mcp-example-server',
  });

  // Check connection to MCP server
  console.log('MCP server running:', client.ping());

  // List all available tools
  console.log('Tools available:');
  const tools = client.listAllTools().tools;
  tools.forEach(tool => console.log(`  - ${tool.name}`));

  // List all available resources
  console.log('Resources available:');
  const resources = client.listAllResources().resources;
  resources.forEach(resource => console.log(`  - ${resource.uri}`));

  // List all available prompts
  console.log('Prompts available:');
  const prompts = client.listAllPrompts().prompts;
  prompts.forEach(prompt => console.log(`  - ${prompt.name}`));

  // Call a sample tool
  const toolResult = client.callTool({ name: 'greet', arguments: { name: 'Grafana k6' } });
  console.log(`Greet tool response: "${toolResult.content[0].text}"`);

  // Read a sample resource
  const resourceContent = client.readResource({ uri: 'embedded:info' });
  console.log(`Resource content: ${resourceContent.contents[0].text}`);

  // Get a sample prompt
  const prompt = client.getPrompt({ name: 'greet' });
  console.log(`Prompt: ${prompt.messages[0].content.text}`);
}
F.A.Q.
What about non-stdio transports?

Both SSE and Streamable HTTP are supported too!

You can use them like this:

// SSE
const client = new mcp.SSEClient({
    base_url: 'http://localhost:3002',
});

// Streamable HTTP
const client = new mcp.StreamableHTTPClient({
    base_url: 'http://localhost:3001',
});
What about pagination?

The extension offers two ways to list resources, tools, and prompts:

// With All: Handles pagination automatically
const allTools = client.listAllTools();
const allResources = client.listAllResources();
const allPrompts = client.listAllPrompts();

// Without All: Requires manual pagination
const first = client.listTools()
const second = client.listTools({ cursor: first.next_cursor });
What about metrics?

The extension automatically tracks RED-style metrics for every MCP operation:

  • mcp_request_duration (trend): Duration of each MCP request (in milliseconds).
  • mcp_request_count (counter): Number of MCP requests made.
  • mcp_request_errors (counter): Number of failed MCP requests.

Each metric is tagged wit:

  • method: The MCP method called (e.g., GetPrompt, ListTools).

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client wraps an MCP client session

func (*Client) CallTool

func (c *Client) CallTool(r mcp.CallToolParams) (*mcp.CallToolResult, error)

func (*Client) GetPrompt

func (c *Client) GetPrompt(r mcp.GetPromptParams) (*mcp.GetPromptResult, error)

func (*Client) ListAllPrompts

func (c *Client) ListAllPrompts(r ListAllPromptsParams) (*ListAllPromptsResult, error)

func (*Client) ListAllResources

func (c *Client) ListAllResources(r ListAllResourcesParams) (*ListAllResourcesResult, error)

func (*Client) ListAllTools

func (c *Client) ListAllTools(r ListAllToolsParams) (*ListAllToolsResult, error)

func (*Client) ListPrompts

func (c *Client) ListPrompts(r mcp.ListPromptsParams) (*mcp.ListPromptsResult, error)

func (*Client) ListResources

func (c *Client) ListResources(r mcp.ListResourcesParams) (*mcp.ListResourcesResult, error)

func (*Client) ListTools

func (c *Client) ListTools(r mcp.ListToolsParams) (*mcp.ListToolsResult, error)

func (*Client) Ping

func (c *Client) Ping() bool

func (*Client) ReadResource

func (c *Client) ReadResource(r mcp.ReadResourceParams) (*mcp.ReadResourceResult, error)

type ClientConfig

type ClientConfig struct {
	// Stdio
	Path  string
	Args  []string
	Env   map[string]string
	Debug bool

	// SSE and Streamable HTTP
	BaseURL string
	Timeout time.Duration

	// Optional HTTP headers (e.g. Authorization)
	Headers map[string]string
}

ClientConfig represents the configuration for the MCP client

type ListAllPromptsParams

type ListAllPromptsParams struct {
	Meta mcp.Meta
}

type ListAllPromptsResult

type ListAllPromptsResult struct {
	Prompts []mcp.Prompt
}

type ListAllResourcesParams

type ListAllResourcesParams struct {
	Meta mcp.Meta
}

type ListAllResourcesResult

type ListAllResourcesResult struct {
	Resources []mcp.Resource
}

type ListAllToolsParams

type ListAllToolsParams struct {
	Meta mcp.Meta
}

type ListAllToolsResult

type ListAllToolsResult struct {
	Tools []mcp.Tool
}

type MCP

type MCP struct{}

MCP is the root module struct

func (*MCP) NewModuleInstance

func (*MCP) NewModuleInstance(vu modules.VU) modules.Instance

NewModuleInstance initializes a new module instance

type MCPInstance

type MCPInstance struct {
	// contains filtered or unexported fields
}

MCPInstance represents an instance of the MCP module

func (*MCPInstance) Exports

func (m *MCPInstance) Exports() modules.Exports

Exports defines the JavaScript-accessible functions

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL