���� =� )com/mobilehackinglab/jadxplugin/McpPlugin java/lang/Object jadx/api/plugins/JadxPlugin PLUGIN_ID Ljava/lang/String;
ConstantValue jadx-mcp serverSocket Ljava/net/ServerSocket; executor &Ljava/util/concurrent/ExecutorService; context $Ljadx/api/plugins/JadxPluginContext;
pluginOptions 2Lcom/mobilehackinglab/jadxplugin/McpPluginOptions; running Z <init> ()V Code
LineNumberTable LocalVariableTable this +Lcom/mobilehackinglab/jadxplugin/McpPlugin; init '(Ljadx/api/plugins/JadxPluginContext;)V $ & 0com/mobilehackinglab/jadxplugin/McpPluginOptions
% ) + - , "jadx/api/plugins/JadxPluginContext . / registerOptions /(Ljadx/api/plugins/options/JadxPluginOptions;)V 1 java/lang/Thread 3 4 5 run A(Lcom/mobilehackinglab/jadxplugin/McpPlugin;)Ljava/lang/Runnable;
0 7 8 (Ljava/lang/Runnable;)V
0 : ; start safePluginStartup
> ? @ waitForJadxLoad ()Z B D C java/lang/System E F err Ljava/io/PrintStream; H 6[MCP] Jadx initialization failed. Not starting server.
J L K java/io/PrintStream M N println (Ljava/lang/String;)V
% P Q R getHttpInterface ()Ljava/lang/String;
T U V parseHttpInterface "(Ljava/lang/String;)Ljava/net/URL;
X Y Z startServer (Ljava/net/URL;)V B \ ] F out
_ a ` java/net/URL b R getProtocol
_ d e R getHost
_ g h i getPort ()I k l m makeConcatWithConstants 9(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
o q p java/lang/Exception r R
getMessage t l u &(Ljava/lang/String;)Ljava/lang/String; w java/io/IOException y "java/lang/IllegalArgumentException
httpInterface Ljava/net/URL; e Ljava/lang/Exception;
StackMapTable
� � @ isDecompilerValid + � � �
getDecompiler ()Ljadx/api/JadxDecompiler;
� � � jadx/api/JadxDecompiler � � getClassesWithInners ()Ljava/util/List; � � � java/util/List � i size � l � (I)Ljava/lang/String; � 3[MCP] Waiting for Jadx to finish loading classes... �
0 � � � sleep (J)V � 7[MCP] Jadx failed to load classes within expected time. � java/lang/InterruptedException retries I count
getPluginInfo #()Ljadx/api/plugins/JadxPluginInfo; � jadx/api/plugins/JadxPluginInfo � JADX MCP Plugin � Exposes Jadx info over HTTP � 3https://github.com/mobilehackinglab/jadx-mcp-plugin � 1.0.0
� � � ](Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V destroy �
� � � java/net/ServerSocket � @ isClosed
� � � close � � � � $java/util/concurrent/ExecutorService � shutdown
Exceptions
� � � java/net/InetAddress � � getByName *(Ljava/lang/String;)Ljava/net/InetAddress;
� � � (IILjava/net/InetAddress;)V
� � � java/util/concurrent/Executors � � newFixedThreadPool )(I)Ljava/util/concurrent/ExecutorService; 3 host port bindAddr Ljava/net/InetAddress; handleConnection (Ljava/net/Socket;)V � java/io/BufferedReader � java/io/InputStreamReader
� � � java/net/Socket � � getInputStream ()Ljava/io/InputStream; � � � !java/nio/charset/StandardCharsets � � UTF_8 Ljava/nio/charset/Charset;
� � � 2(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
� � � (Ljava/io/Reader;)V
� � � � getOutputStream ()Ljava/io/OutputStream;
� � � R readLine
� � � java/io/OutputStream
� �
� � �
java/lang/String split '(Ljava/lang/String;)[Ljava/lang/String;
R toLowerCase content-length:
startsWith (Ljava/lang/String;)Z
i length
� substring
R trim
java/lang/Integer parseInt (Ljava/lang/String;)I
@ isEmpty
�!"# read ([C)I
% & ([CII)V( /invoke
*+, equals (Ljava/lang/Object;)Z. POST
01
equalsIgnoreCase
34 u processInvokeRequest6 {8 org/json/JSONObject
7: N
7 = result
7?@A put ;(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;C error tF /tools
HI R getToolsJsonK Not found
7MN � toString
PQR getBytes (Ljava/nio/charset/Charset;)[BT java/io/PrintWriter
SV W (Ljava/io/OutputStream;Z)VY ZHTTP/1.1 200 OK
Content-Type: application/json
Content-Length: %d
Connection: close
[\] valueOf (I)Ljava/lang/Integer;
S_`a printf <(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;
Scd flush
�fgh write ([B)V
�c
kml java/lang/Throwableno
addSuppressed (Ljava/lang/Throwable;)V t socket Ljava/net/Socket; in Ljava/io/BufferedReader; outStream Ljava/io/OutputStream; requestLine method path
contentLength header buffer [C bytesRead body responseJson Lorg/json/JSONObject; respBytes [B Ljava/io/PrintWriter;}�Y{
"tools": [
{ "name": "get_class_source", "description": "Returns the decompiled source of a class.", "parameters": { "class_name": "string" } },
{ "name": "search_method_by_name", "description": "Search methods by name.", "parameters": { "method_name": "string" } },
{ "name": "search_class_by_name", "description": "Search class names containing a keyword.", "parameters": { "query": "string" } },
{ "name": "list_all_classes", "description": "Returns a list of all class names.", "parameters": { "offset": "int", "limit": "int" } },
{ "name": "get_methods_of_class", "description": "Returns all method names of a class.", "parameters": { "class_name": "string" } },
{ "name": "get_fields_of_class", "description": "Returns all field names of a class.", "parameters": { "class_name": "string" } },
{ "name": "get_method_code", "description": "Returns the code for a specific method.", "parameters": { "class_name": "string", "method_name": "string" } },
{ "name": "get_apk_components", "description": "获取AndroidManifest.xml中声明的所有四大组件及其属性", "parameters": {} },
{ "name": "get_apk_info", "description": "获取APK基本信息", "parameters": {} },
{ "name": "get_intent_filters", "description": "获取所有组件的intent-filter", "parameters": {} },
{ "name": "get_exported_components", "description": "获取所有exported=true或隐式导出的组件", "parameters": {} },
{ "name": "list_broadcast_receivers", "description": "获取所有BroadcastReceiver及其intent-filter", "parameters": {} },
{ "name": "get_declared_permissions", "description": "获取Manifest中声明的所有权限", "parameters": {} },
{ "name": "get_defined_permissions", "description": "获取Manifest中自定义的权限", "parameters": {} },
{ "name": "get_application_attributes", "description": "获取<application>标签的所有属性", "parameters": {} },
{ "name": "get_all_meta_data", "description": "获取Manifest及组件下所有meta-data信息", "parameters": {} }
]
}
� org/json/JSONException� tool
7�� u getString�
parameters
7���
optJSONObject )(Ljava/lang/String;)Lorg/json/JSONObject;
�� i hashCode� get_exported_components� get_apk_components� get_apk_info� get_all_meta_data� get_declared_permissions� get_application_attributes� get_method_code� search_class_by_name� get_fields_of_class� get_class_source� get_methods_of_class� list_broadcast_receivers� get_defined_permissions� list_all_classes� get_intent_filters� search_method_by_name
��� handleGetClassSource )(Lorg/json/JSONObject;)Ljava/lang/String;
��� handleSearchMethodByName
��� handleSearchClassByName
��� handleListAllClasses
��� handleGetMethodsOfClass
��� handleGetFieldsOfClass
��� handleGetMethodCode
��� handleGetApkComponents
��� handleGetApkInfo
��� handleGetIntentFilters
��� handleGetExportedComponents
��� handleListBroadcastReceivers
��� handleGetDeclaredPermissions
��� handleGetDefinedPermissions
��� handleGetApplicationAttributes
��� handleGetAllMetaData t
7�N R requestBody requestJson toolName params� query�
7��� optString 8(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;� org/json/JSONArray
� ���� iterator ()Ljava/util/Iterator; java/util/Iterator next ()Ljava/lang/Object; jadx/api/JavaClass
R getFullName
contains (Ljava/lang/CharSequence;)Z
�@ ((Ljava/lang/Object;)Lorg/json/JSONArray; @ hasNext results array Lorg/json/JSONArray; cls Ljadx/api/JavaClass; fullName
class_name
� �
getClasses
!"