@@ -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