Skip to content

Commit a246b6a

Browse files
committed
feat: add option to limit the modules returned
1 parent 9d71184 commit a246b6a

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
IMPROVEMENTS
44

5+
* Add `limit`, `provider`, `namespace`, and `verified` parameters to `search_modules` tool for pagination and filtering to reduce API costs [271](https://github.com/hashicorp/terraform-mcp-server/pull/271)
56
* Set custom User-Agent header for TFE API requests to enable tracking MCP server usage separately from other go-tfe clients [268](https://github.com/hashicorp/terraform-mcp-server/pull/268)
67

78
## 0.4.0

pkg/tools/registry/search_modules.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ If no modules were found, reattempt the search with a new moduleName query.`),
4444
mcp.Min(0),
4545
mcp.DefaultNumber(0),
4646
),
47+
mcp.WithNumber("limit",
48+
mcp.Description("Maximum number of results to return (default: 10, max: 100)"),
49+
mcp.Min(1),
50+
mcp.DefaultNumber(10),
51+
),
52+
mcp.WithString("provider",
53+
mcp.Description("Filter results to a specific provider (e.g., 'aws', 'google', 'azurerm')"),
54+
),
55+
mcp.WithString("namespace",
56+
mcp.Description("Filter results to a specific namespace"),
57+
),
58+
mcp.WithBoolean("verified",
59+
mcp.Description("If true, only return verified partner modules"),
60+
),
4761
),
4862
Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
4963
return getSearchModulesHandler(ctx, request, logger)
@@ -58,13 +72,20 @@ func getSearchModulesHandler(ctx context.Context, request mcp.CallToolRequest, l
5872
}
5973
moduleQuery = strings.ToLower(moduleQuery)
6074
currentOffsetValue := request.GetInt("current_offset", 0)
75+
limitValue := request.GetInt("limit", 10)
76+
if limitValue > 100 {
77+
limitValue = 100 // Cap at 100 to prevent excessive API usage
78+
}
79+
providerFilter := request.GetString("provider", "")
80+
namespaceFilter := request.GetString("namespace", "")
81+
verifiedOnly := request.GetBool("verified", false)
6182

6283
httpClient, err := client.GetHttpClientFromContext(ctx, logger)
6384
if err != nil {
6485
return ToolError(logger, "failed to get http client for public Terraform registry", err)
6586
}
6687

67-
response, err := sendSearchModulesCall(httpClient, moduleQuery, currentOffsetValue, logger)
88+
response, err := sendSearchModulesCall(httpClient, moduleQuery, currentOffsetValue, limitValue, providerFilter, namespaceFilter, verifiedOnly, logger)
6889
if err != nil {
6990
return ToolErrorf(logger, "no modules found for query: %s - try a different search term", moduleQuery)
7091
}
@@ -81,12 +102,22 @@ func getSearchModulesHandler(ctx context.Context, request mcp.CallToolRequest, l
81102
return mcp.NewToolResultText(modulesData), nil
82103
}
83104

84-
func sendSearchModulesCall(providerClient *http.Client, moduleQuery string, currentOffset int, logger *log.Logger) ([]byte, error) {
105+
func sendSearchModulesCall(providerClient *http.Client, moduleQuery string, currentOffset, limit int, provider, namespace string, verified bool, logger *log.Logger) ([]byte, error) {
85106
uri := "modules"
86107
if moduleQuery != "" {
87-
uri = fmt.Sprintf("%s/search?q='%s'&offset=%v", uri, url.PathEscape(moduleQuery), currentOffset)
108+
uri = fmt.Sprintf("%s/search?q='%s'&offset=%v&limit=%v", uri, url.PathEscape(moduleQuery), currentOffset, limit)
88109
} else {
89-
uri = fmt.Sprintf("%s?offset=%v", uri, currentOffset)
110+
uri = fmt.Sprintf("%s?offset=%v&limit=%v", uri, currentOffset, limit)
111+
}
112+
// Add optional filters
113+
if provider != "" {
114+
uri = fmt.Sprintf("%s&provider=%s", uri, url.PathEscape(provider))
115+
}
116+
if namespace != "" {
117+
uri = fmt.Sprintf("%s&namespace=%s", uri, url.PathEscape(namespace))
118+
}
119+
if verified {
120+
uri = fmt.Sprintf("%s&verified=true", uri)
90121
}
91122

92123
response, err := client.SendRegistryCall(providerClient, "GET", uri, logger)

0 commit comments

Comments
 (0)