nia-mcp-server 1.0.17__py3-none-any.whl → 1.0.19__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nia-mcp-server might be problematic. Click here for more details.
- nia_mcp_server/__init__.py +1 -1
- nia_mcp_server/api_client.py +122 -1
- nia_mcp_server/server.py +1172 -377
- {nia_mcp_server-1.0.17.dist-info → nia_mcp_server-1.0.19.dist-info}/METADATA +1 -1
- {nia_mcp_server-1.0.17.dist-info → nia_mcp_server-1.0.19.dist-info}/RECORD +8 -8
- {nia_mcp_server-1.0.17.dist-info → nia_mcp_server-1.0.19.dist-info}/WHEEL +0 -0
- {nia_mcp_server-1.0.17.dist-info → nia_mcp_server-1.0.19.dist-info}/entry_points.txt +0 -0
- {nia_mcp_server-1.0.17.dist-info → nia_mcp_server-1.0.19.dist-info}/licenses/LICENSE +0 -0
nia_mcp_server/__init__.py
CHANGED
nia_mcp_server/api_client.py
CHANGED
|
@@ -758,4 +758,125 @@ class NIAApiClient:
|
|
|
758
758
|
except httpx.HTTPStatusError as e:
|
|
759
759
|
raise self._handle_api_error(e)
|
|
760
760
|
except Exception as e:
|
|
761
|
-
raise APIError(f"Failed to check local filesystem status: {str(e)}")
|
|
761
|
+
raise APIError(f"Failed to check local filesystem status: {str(e)}")
|
|
762
|
+
|
|
763
|
+
# ========================================================================
|
|
764
|
+
# CHROMA PACKAGE SEARCH METHODS
|
|
765
|
+
# ========================================================================
|
|
766
|
+
|
|
767
|
+
async def package_search_grep(
|
|
768
|
+
self,
|
|
769
|
+
registry: str,
|
|
770
|
+
package_name: str,
|
|
771
|
+
pattern: str,
|
|
772
|
+
version: Optional[str] = None,
|
|
773
|
+
language: Optional[str] = None,
|
|
774
|
+
filename_sha256: Optional[str] = None,
|
|
775
|
+
a: Optional[int] = None,
|
|
776
|
+
b: Optional[int] = None,
|
|
777
|
+
c: Optional[int] = None,
|
|
778
|
+
head_limit: Optional[int] = None,
|
|
779
|
+
output_mode: str = "content"
|
|
780
|
+
) -> Dict[str, Any]:
|
|
781
|
+
"""Execute grep search on package source code via Chroma."""
|
|
782
|
+
try:
|
|
783
|
+
payload = {
|
|
784
|
+
"registry": registry,
|
|
785
|
+
"package_name": package_name,
|
|
786
|
+
"pattern": pattern,
|
|
787
|
+
"version": version,
|
|
788
|
+
"language": language,
|
|
789
|
+
"filename_sha256": filename_sha256,
|
|
790
|
+
"a": a,
|
|
791
|
+
"b": b,
|
|
792
|
+
"c": c,
|
|
793
|
+
"head_limit": head_limit,
|
|
794
|
+
"output_mode": output_mode
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
# Remove None values
|
|
798
|
+
payload = {k: v for k, v in payload.items() if v is not None}
|
|
799
|
+
|
|
800
|
+
response = await self.client.post(
|
|
801
|
+
f"{self.base_url}/v2/package-search/grep",
|
|
802
|
+
json=payload
|
|
803
|
+
)
|
|
804
|
+
response.raise_for_status()
|
|
805
|
+
return response.json()
|
|
806
|
+
|
|
807
|
+
except httpx.HTTPStatusError as e:
|
|
808
|
+
raise self._handle_api_error(e)
|
|
809
|
+
except Exception as e:
|
|
810
|
+
raise APIError(f"Failed to search package with grep: {str(e)}")
|
|
811
|
+
|
|
812
|
+
async def package_search_hybrid(
|
|
813
|
+
self,
|
|
814
|
+
registry: str,
|
|
815
|
+
package_name: str,
|
|
816
|
+
semantic_queries: List[str],
|
|
817
|
+
version: Optional[str] = None,
|
|
818
|
+
filename_sha256: Optional[str] = None,
|
|
819
|
+
pattern: Optional[str] = None,
|
|
820
|
+
language: Optional[str] = None
|
|
821
|
+
) -> Dict[str, Any]:
|
|
822
|
+
"""Execute hybrid semantic search on package source code via Chroma."""
|
|
823
|
+
try:
|
|
824
|
+
payload = {
|
|
825
|
+
"registry": registry,
|
|
826
|
+
"package_name": package_name,
|
|
827
|
+
"semantic_queries": semantic_queries,
|
|
828
|
+
"version": version,
|
|
829
|
+
"filename_sha256": filename_sha256,
|
|
830
|
+
"pattern": pattern,
|
|
831
|
+
"language": language
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
# Remove None values
|
|
835
|
+
payload = {k: v for k, v in payload.items() if v is not None}
|
|
836
|
+
|
|
837
|
+
response = await self.client.post(
|
|
838
|
+
f"{self.base_url}/v2/package-search/hybrid",
|
|
839
|
+
json=payload
|
|
840
|
+
)
|
|
841
|
+
response.raise_for_status()
|
|
842
|
+
return response.json()
|
|
843
|
+
|
|
844
|
+
except httpx.HTTPStatusError as e:
|
|
845
|
+
raise self._handle_api_error(e)
|
|
846
|
+
except Exception as e:
|
|
847
|
+
raise APIError(f"Failed to search package with hybrid search: {str(e)}")
|
|
848
|
+
|
|
849
|
+
async def package_search_read_file(
|
|
850
|
+
self,
|
|
851
|
+
registry: str,
|
|
852
|
+
package_name: str,
|
|
853
|
+
filename_sha256: str,
|
|
854
|
+
start_line: int,
|
|
855
|
+
end_line: int,
|
|
856
|
+
version: Optional[str] = None
|
|
857
|
+
) -> Dict[str, Any]:
|
|
858
|
+
"""Read specific lines from a package file via Chroma."""
|
|
859
|
+
try:
|
|
860
|
+
payload = {
|
|
861
|
+
"registry": registry,
|
|
862
|
+
"package_name": package_name,
|
|
863
|
+
"filename_sha256": filename_sha256,
|
|
864
|
+
"start_line": start_line,
|
|
865
|
+
"end_line": end_line,
|
|
866
|
+
"version": version
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
# Remove None values
|
|
870
|
+
payload = {k: v for k, v in payload.items() if v is not None}
|
|
871
|
+
|
|
872
|
+
response = await self.client.post(
|
|
873
|
+
f"{self.base_url}/v2/package-search/read-file",
|
|
874
|
+
json=payload
|
|
875
|
+
)
|
|
876
|
+
response.raise_for_status()
|
|
877
|
+
return response.json()
|
|
878
|
+
|
|
879
|
+
except httpx.HTTPStatusError as e:
|
|
880
|
+
raise self._handle_api_error(e)
|
|
881
|
+
except Exception as e:
|
|
882
|
+
raise APIError(f"Failed to read package file: {str(e)}")
|