Skip to main content
Glama

OpenFGA MCP

document_symbols_cache_v23-06-25.pkl489 kB
��}�(�src/Server.php-False�� ebb5be6d481c8e630771874e6dfcd3e1�]�(}�(�name��$apiUrl��kind�K �range�}�(�start�}�(�line�K� character�Ku�end�}�(h Kh K uu�selectionRange�}�(h }�(h Kh Kuh}�(h Kh K uu�location�}�(�uri��@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php��range�h � absolutePath��9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�� relativePath��src/Server.php�u�children�]��parent�Nu}�(h� $hasToken�hK h}�(h }�(h Kh Kuh}�(h Kh K uuh}�(h }�(h Kh Kuh}�(h Kh K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh"h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $hasClientId�hK h}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh.h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$isOfflineMode�hK h}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh:h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$openfga�hK h}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhFh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$authentication�hK h}�(h }�(h K%h Kuh}�(h K%h Kuuh}�(h }�(h K%h Kuh}�(h K%h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhRh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$authentication�hK h}�(h }�(h K(h K uh}�(h K(h Kuuh}�(h }�(h K(h K uh}�(h K(h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh^h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$authentication�hK h}�(h }�(h K.h K uh}�(h K.h Kuuh}�(h }�(h K.h K uh}�(h K.h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $finalUrl�hK h}�(h }�(h K7h Kuh}�(h K7h Kuuh}�(h }�(h K7h Kuh}�(h K7h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhvh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$openfga�hK h}�(h }�(h K9h Kuh}�(h K9h Kuuh}�(h }�(h K9h Kuh}�(h K9h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�Closure�hK h}�(h }�(h K@h K7uh}�(h KBh K uuh}�(h }�(h K@h K7uh}�(h KBh K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�Closure�hK h}�(h }�(h KBh Kuh}�(h KDh K uuh}�(h }�(h KBh Kuh}�(h KDh K uu�children�]�}�(h�$error�hK h}�(h }�(h KBh K)uh}�(h KBh K5uuh}�(h }�(h KBh K/uh}�(h KBh K5uuhh�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�uah}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuhNuh�}�(h�$connectionError�hK h}�(h }�(h KEh Kuh}�(h KEh K+uuh}�(h }�(h KEh Kuh}�(h KEh K+uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $container�hK h}�(h }�(h KPh Kuh}�(h KPh Kuuh}�(h }�(h KPh Kuh}�(h KPh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$server�hK h}�(h }�(h KSh Kuh}�(h KSh K uuh}�(h }�(h KSh Kuh}�(h KSh K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $startTime�hK h}�(h }�(h Kbh Kuh}�(h Kbh Kuuh}�(h }�(h Kbh Kuh}�(h Kbh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $docIndex�hK h}�(h }�(h Kch Kuh}�(h Kch Kuuh}�(h }�(h Kch Kuh}�(h Kch Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$endTime�hK h}�(h }�(h Keh Kuh}�(h Keh Kuuh}�(h }�(h Keh Kuh}�(h Keh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $loadTime�hK h}�(h }�(h Kfh Kuh}�(h Kfh Kuuh}�(h }�(h Kfh Kuh}�(h Kfh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hh�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$sdks�hK h}�(h }�(h Kih Kuh}�(h Kih K uuh}�(h }�(h Kih Kuh}�(h Kih K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $sdkCount�hK h}�(h }�(h Kjh Kuh}�(h Kjh Kuuh}�(h }�(h Kjh Kuh}�(h Kjh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�$sdk�hK h}�(h }�(h Koh Kuh}�(h Koh Kuuh}�(h }�(h Koh Kuh}�(h Koh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $overview�hK h}�(h }�(h Kph K uh}�(h Kph Kuuh}�(h }�(h Kph K uh}�(h Kph Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj+h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $classCount�hK h}�(h }�(h Ksh Kuh}�(h Ksh Kuuh}�(h }�(h Ksh Kuh}�(h Ksh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj7h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $sectionCount�hK h}�(h }�(h Kth Kuh}�(h Kth Kuuh}�(h }�(h Kth Kuh}�(h Kth Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjCh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $chunkCount�hK h}�(h }�(h Kuh Kuh}�(h Kuh Kuuh}�(h }�(h Kuh Kuh}�(h Kuh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjOh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $generalDoc�hK h}�(h }�(h K{h K-uh}�(h K{h K8uuh}�(h }�(h K{h K-uh}�(h K{h K8uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj[h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $overview�hK h}�(h }�(h K|h K uh}�(h K|h Kuuh}�(h }�(h K|h K uh}�(h K|h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjgh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $sectionCount�hK h}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h }�(h Kh Kuh}�(h Kh Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjsh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $chunkCount�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $docError�hK h}�(h }�(h K�h Kuh}�(h K�h K uuh}�(h }�(h K�h Kuh}�(h K�h K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $transport�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�Closure�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuh�]�}�(h� $exception�hK h}�(h }�(h K�h K+uh}�(h K�h K?uuh}�(h }�(h K�h K5uh}�(h K�h K?uuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�uah}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuhNuj�}�(h�Closure�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuh�]�(}�(h� $severity�hK h}�(h }�(h K�h K'uh}�(h K�h K0uuh}�(h }�(h K�h K'uh}�(h K�h K0uuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�u}�(h�$message�hK h}�(h }�(h K�h K2uh}�(h K�h K:uuh}�(h }�(h K�h K2uh}�(h K�h K:uuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�u}�(h�$file�hK h}�(h }�(h K�h K<uh}�(h K�h KAuuh}�(h }�(h K�h K<uh}�(h K�h KAuuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�u}�(h�$line�hK h}�(h }�(h K�h KCuh}�(h K�h KHuuh}�(h }�(h K�h KCuh}�(h K�h KHuuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�ueh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuhNuj�j�j�j�}�(h�Closure�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuh�]�}�(h�$error�hK h}�(h }�(h K�h Kuh}�(h K�h Kuuh}�(h }�(h K�h Kuh}�(h K�h Kuuhj�h}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�uah}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj�h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuhNuj�}�(h�Closure�hK h}�(h }�(h K�h Kuh}�(h Mh K uuh}�(h }�(h K�h Kuh}�(h Mh K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h�Closure�hK h}�(h }�(h Mh Kuh}�(h M h K uuh}�(h }�(h Mh Kuh}�(h M h K uuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hjh�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNu}�(h� $throwable�hK h}�(h }�(h M h Kuh}�(h M h Kuuh}�(h }�(h M h Kuh}�(h M h Kuuh}�(h�@file:///Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hj'h�9/Users/evan/Developer/evansims/openfga-mcp/src/Server.php�hhuh]�hNue]�(hh h,h8hDhPh\hhhth�h�h�h�h�h�h�h�h�h�jjjj)j5jAjMjYjejqj}j�j�j�j�j�j jj%e�����!src/Tools/AbstractTools.php-False�� 4d5fecbff19731d705c618b9f8b2be70�]�(}�(�name��OpenFGA\MCP\Tools��kind�K�range�}�(�start�}�(�line�K� character�Ku�end�}�(j?Kj@Kuu�selectionRange�}�(j=}�(j?Kj@K ujA}�(j?Kj@Kuuh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj<h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�h�src/Tools/AbstractTools.php�uh]�hNu}�(j8� AbstractTools�j:Kj;}�(j=}�(j?K j@KujA}�(j?KXj@KuujC}�(j=}�(j?K j@KujA}�(j?K j@K%uu�children�]�(}�(j8�checkOfflineMode�j:Kj;}�(j=}�(j?K j@KujA}�(j?Kj@KuujC}�(j=}�(j?Kj@KujA}�(j?Kj@K'uujT]�}�(j8� $operation�j:K j;}�(j=}�(j?Kj@K(ujA}�(j?Kj@K9uujC}�(j=}�(j?Kj@K/ujA}�(j?Kj@K9uuhjVh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjah�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�uahjLh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjXh�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuu}�(j8�checkRestrictedMode�j:Kj;}�(j=}�(j?Kj@KujA}�(j?K8j@KuujC}�(j=}�(j?K!j@KujA}�(j?K!j@K*uujT]�(}�(j8�$storeId�j:K j;}�(j=}�(j?K!j@K+ujA}�(j?K!j@KBuujC}�(j=}�(j?K!j@K3ujA}�(j?K!j@K;uuhjnh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjyh�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�u}�(j8�$modelId�j:K j;}�(j=}�(j?K!j@KDujA}�(j?K!j@K[uujC}�(j=}�(j?K!j@KLujA}�(j?K!j@KTuuhjnh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�u}�(j8�$restrictedStore�j:K j;}�(j=}�(j?K(j@K ujA}�(j?K(j@KuujC}�(j=}�(j?K(j@K ujA}�(j?K(j@Kuuhjnh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�u}�(j8�$restrictedModel�j:K j;}�(j=}�(j?K0j@K ujA}�(j?K0j@KuujC}�(j=}�(j?K0j@K ujA}�(j?K0j@Kuuhjnh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�uehjLh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjph�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuu}�(j8�checkRestrictedModeForWrites�j:Kj;}�(j=}�(j?K:j@KujA}�(j?KGj@KuujC}�(j=}�(j?K@j@KujA}�(j?K@j@K3uujT]�}�(j8� $operation�j:K j;}�(j=}�(j?K@j@K4ujA}�(j?K@j@KEuujC}�(j=}�(j?K@j@K;ujA}�(j?K@j@KEuuhj�h}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�uahjLh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuu}�(j8�checkWritePermission�j:Kj;}�(j=}�(j?KIj@KujA}�(j?KWj@KuujC}�(j=}�(j?KOj@KujA}�(j?KOj@K+uujT]�}�(j8� $operation�j:K j;}�(j=}�(j?KOj@K,ujA}�(j?KOj@K=uujC}�(j=}�(j?KOj@K3ujA}�(j?KOj@K=uuhj�h}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuh]�uahjLh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hj�h�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuueh}�(h�Mfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjNh�F/Users/evan/Developer/evansims/openfga-mcp/src/Tools/AbstractTools.php�hjJuhNujVj_jnjwj�j�j�j�j�j�j�e]�(j7jLe�����%src/Tools/DocumentationTools.php-True�� c176f7802346eaf296bf7181e6d1c4ef�]�(}�(�name��OpenFGA\MCP\Tools��kind�K�range�}�(�start�}�(�line�K� character�Ku�end�}�(j�Kj�Kuu�selectionRange�}�(j�}�(j�Kj�K uj�}�(j�Kj�Kuu�location�}�(�uri��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php��range�j�� absolutePath��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�� relativePath�� src/Tools/DocumentationTools.php�u�body��namespace OpenFGA\MCP\Tools;��children�]��parent�Nu}�(j��DocumentationTools�j�Kj�}�(j�}�(j�Kj�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�Kj�Kuj�}�(j�Kj�K'uu�children�]�(}�(j��$client��detail�� (promoted)�j�Kj�}�(j�}�(j�Kj�Kuj�}�(j�Kj�K'uuj�}�(j�}�(j�Kj�K uj�}�(j�Kj�K'uujjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� private ClientInterface $client,�j�]�u}�(j�� __construct�j�K j�}�(j�}�(j�Kj�Kuj�}�(j�Kj�Kuuj�}�(j�}�(j�Kj�Kuj�}�(j�Kj�Kuuj ]�}�(j��$client�j�K j�}�(j�}�(j�Kj�Kuj�}�(j�Kj�K'uuj�}�(j�}�(j�Kj�K uj�}�(j�Kj�K'uujjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j%j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� private ClientInterface $client,�j�]�uajjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj���public function __construct( /** @phpstan-ignore property.onlyWritten */ private ClientInterface $client, ) { }�u}�(j��findSimilarDocumentation�j�Kj�}�(j�}�(j�Kj�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K(j�Kuj�}�(j�K(j�K,uuj ]�(}�(j��$content�j�K j�}�(j�}�(j�K)j�Kuj�}�(j�K)j�Kuuj�}�(j�}�(j�K)j�Kuj�}�(j�K)j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j?j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $content,�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�K*j�Kuj�}�(j�K*j�Kuuj�}�(j�}�(j�K*j�Kuj�}�(j�K*j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jLj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $sdk = null,�j�]�u}�(j��$similarity_threshold�j�K j�}�(j�}�(j�K+j�Kuj�}�(j�K+j�K)uuj�}�(j�}�(j�K+j�Kuj�}�(j�K+j�K#uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jYj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"float $similarity_threshold = 0.5,�j�]�u}�(j��$limit�j�K j�}�(j�}�(j�K,j�Kuj�}�(j�K,j�Kuuj�}�(j�}�(j�K,j�K uj�}�(j�K,j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jfj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $limit = 5,�j�]�u}�(j�� $validSdks�j�K j�}�(j�}�(j�K:j�Kuj�}�(j�K:j�Kuuj�}�(j�}�(j�K:j�Kuj�}�(j�K:j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jsj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��N$validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null];�j�]�u}�(j��$index�j�K j�}�(j�}�(j�K@j�Kuj�}�(j�K@j�Kuuj�}�(j�}�(j�K@j�Kuj�}�(j�K@j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��4$index = DocumentationIndexSingleton::getInstance();�j�]�u}�(j�� $keyTerms�j�K j�}�(j�}�(j�KGj�Kuj�}�(j�KGj�Kuuj�}�(j�}�(j�KGj�Kuj�}�(j�KGj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��-$keyTerms = $this->extractKeyTerms($content);�j�]�u}�(j��$similarChunks�j�K j�}�(j�}�(j�KOj�Kuj�}�(j�KOj�Kuuj�}�(j�}�(j�KOj�Kuj�}�(j�KOj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$similarChunks = [];�j�]�u}�(j��$keyTerm�j�K j�}�(j�}�(j�KQj�Kuj�}�(j�KQj�K&uuj�}�(j�}�(j�KQj�Kuj�}�(j�KQj�K&uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $keyTerm) {�j�]�u}�(j��$chunks�j�K j�}�(j�}�(j�KRj�K uj�}�(j�KRj�Kuuj�}�(j�}�(j�KRj�K uj�}�(j�KRj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��;$chunks = $index->searchChunks($keyTerm, $sdk, $limit * 2);�j�]�u}�(j��$chunk�j�K j�}�(j�}�(j�KTj�K uj�}�(j�KTj�K&uuj�}�(j�}�(j�KTj�K uj�}�(j�KTj�K&uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $chunk) {�j�]�u}�(j�� $chunkContent�j�K j�}�(j�}�(j�KWj�Kuj�}�(j�KWj�Kuuj�}�(j�}�(j�KWj�Kuj�}�(j�KWj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��C$chunkContent = $this->getChunkContent($chunk['chunk_id'], $index);�j�]�u}�(j�� $similarity�j�K j�}�(j�}�(j�KXj�Kuj�}�(j�KXj�Kuuj�}�(j�}�(j�KXj�Kuj�}�(j�KXj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��B$similarity = $this->calculateSimilarity($content, $chunkContent);�j�]�u}�(j��$chunkWithSimilarity�j�K j�}�(j�}�(j�K\j�Kuj�}�(j�K\j�K(uuj�}�(j�}�(j�K\j�Kuj�}�(j�K\j�K(uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$chunkWithSimilarity = $chunk;�j�]�u}�(j��$chunkWithSimilarity�j�K j�}�(j�}�(j�K]j�Kuj�}�(j�K]j�K(uuj�}�(j�}�(j�K]j�Kuj�}�(j�K]j�K(uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$chunkWithSimilarity['similarity'] = $similarity;�j�]�u}�(j��$chunkWithSimilarity�j�K j�}�(j�}�(j�K^j�Kuj�}�(j�K^j�K(uuj�}�(j�}�(j�K^j�Kuj�}�(j�K^j�K(uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$chunkWithSimilarity['content'] = $chunkContent;�j�]�u}�(j�� $chunkKey�j�K j�}�(j�}�(j�K`j�Kuj�}�(j�K`j�Kuuj�}�(j�}�(j�K`j�Kuj�}�(j�K`j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��6$chunkKey = $chunk['sdk'] . '::' . $chunk['chunk_id'];�j�]�u}�(j��$similarChunks�j�K j�}�(j�}�(j�Kcj�Kuj�}�(j�Kcj�K&uuj�}�(j�}�(j�Kcj�Kuj�}�(j�Kcj�K&uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$similarChunks[$chunkKey] = $chunkWithSimilarity;�j�]�u}�(j�� $chunkKey�j�K j�}�(j�}�(j�Kcj�K'uj�}�(j�Kcj�K0uuj�}�(j�}�(j�Kcj�K'uj�}�(j�Kcj�K0uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j)j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"$chunkKey] = $chunkWithSimilarity;�j�]�u}�(j�� $existingSim�j�K j�}�(j�}�(j�Kej�Kuj�}�(j�Kej�K$uuj�}�(j�}�(j�Kej�Kuj�}�(j�Kej�K$uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j6j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��7$existingSim = $similarChunks[$chunkKey]['similarity'];�j�]�u}�(j��$similarChunks�j�K j�}�(j�}�(j�Khj�Kuj�}�(j�Khj�K*uuj�}�(j�}�(j�Khj�Kuj�}�(j�Khj�K*uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jCj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$similarChunks[$chunkKey] = $chunkWithSimilarity;�j�]�u}�(j�� $chunkKey�j�K j�}�(j�}�(j�Khj�K+uj�}�(j�Khj�K4uuj�}�(j�}�(j�Khj�K+uj�}�(j�Khj�K4uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jPj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"$chunkKey] = $chunkWithSimilarity;�j�]�u}�(j��Closure�j�K j�}�(j�}�(j�Kpj�Kuj�}�(j�Kvj�K uuj�}�(j�}�(j�Kpj�Kuj�}�(j�Kvj�K uuj ]�(}�(j��$a�j�K j�}�(j�}�(j�Kpj�K/uj�}�(j�Kpj�K7uuj�}�(j�}�(j�Kpj�K5uj�}�(j�Kpj�K7uujj[j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jfj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��array $a, array $b): int {�j�]�u}�(j��$b�j�K j�}�(j�}�(j�Kpj�K9uj�}�(j�Kpj�KAuuj�}�(j�}�(j�Kpj�K?uj�}�(j�Kpj�KAuujj[j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jsj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��array $b): int {�j�]�u}�(j�� $aSimilarity�j�K j�}�(j�}�(j�Krj�K uj�}�(j�Krj�Kuuj�}�(j�}�(j�Krj�K uj�}�(j�Krj�Kuujj[j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$aSimilarity = isset($a['similarity']) && is_numeric($a['similarity']) ? $a['similarity'] : 0.0;�j�]�u}�(j�� $bSimilarity�j�K j�}�(j�}�(j�Ksj�K uj�}�(j�Ksj�Kuuj�}�(j�}�(j�Ksj�K uj�}�(j�Ksj�Kuujj[j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$bSimilarity = isset($b['similarity']) && is_numeric($b['similarity']) ? $b['similarity'] : 0.0;�j�]�uejj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j]j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�static function (array $a, array $b): int { // Since we know similarity is added above, we can safely access it $aSimilarity = isset($a['similarity']) && is_numeric($a['similarity']) ? $a['similarity'] : 0.0; $bSimilarity = isset($b['similarity']) && is_numeric($b['similarity']) ? $b['similarity'] : 0.0; return $bSimilarity <=> $aSimilarity; });�u}�(j��$similarChunks�j�K j�}�(j�}�(j�Kyj�Kuj�}�(j�Kyj�Kuuj�}�(j�}�(j�Kyj�Kuj�}�(j�Kyj�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��8$similarChunks = array_slice($similarChunks, 0, $limit);�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��+$markdown = "## Similar Documentation\n\n";�j�]�u}�(j�� $chunkIndex�j�K j�}�(j�}�(j�K�j�K#uj�}�(j�K�j�K.uuj�}�(j�}�(j�K�j�K#uj�}�(j�K�j�K.uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$chunkIndex => $chunk) {�j�]�u}�(j��$chunk�j�K j�}�(j�}�(j�K�j�K2uj�}�(j�K�j�K8uuj�}�(j�}�(j�K�j�K2uj�}�(j�K�j�K8uujj4j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $chunk) {�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j6j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�/** * Find documentation similar to provided content. * * @param string $content Reference content to find similar documentation * @param string|null $sdk Limit search to specific SDK * @param float $similarity_threshold Minimum similarity score (0.0-1.0, default: 0.5) * @param int $limit Maximum number of results (default: 5) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted related documentation */ #[McpTool(name: 'find_similar_documentation')] public function findSimilarDocumentation( string $content, ?string $sdk = null, float $similarity_threshold = 0.5, int $limit = 5, ): string { if ('' === trim($content)) { return '❌ Content cannot be empty'; } if (0.0 > $similarity_threshold || 1.0 < $similarity_threshold) { return '❌ Similarity threshold must be between 0.0 and 1.0'; } if (1 > $limit || 20 < $limit) { return '❌ Limit must be between 1 and 20'; } $validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null]; if (! in_array($sdk, $validSdks, true)) { return '❌ Invalid SDK. Must be one of: php, go, python, java, dotnet, js, laravel'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Extract key terms from content for similarity matching $keyTerms = $this->extractKeyTerms($content); if ([] === $keyTerms) { return '❌ Could not extract meaningful terms from the provided content'; } // Search for similar content using key terms /** @var array<string, array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>, similarity?: float, content?: string}> $similarChunks */ $similarChunks = []; foreach ($keyTerms as $keyTerm) { $chunks = $index->searchChunks($keyTerm, $sdk, $limit * 2); foreach ($chunks as $chunk) { // Get content from the chunk to calculate similarity // We need to get the actual content - the preview is just a snippet $chunkContent = $this->getChunkContent($chunk['chunk_id'], $index); $similarity = $this->calculateSimilarity($content, $chunkContent); if ($similarity >= $similarity_threshold) { // Add similarity and content to the chunk $chunkWithSimilarity = $chunk; $chunkWithSimilarity['similarity'] = $similarity; $chunkWithSimilarity['content'] = $chunkContent; $chunkKey = $chunk['sdk'] . '::' . $chunk['chunk_id']; if (! isset($similarChunks[$chunkKey])) { $similarChunks[$chunkKey] = $chunkWithSimilarity; } elseif (isset($similarChunks[$chunkKey]['similarity'])) { $existingSim = $similarChunks[$chunkKey]['similarity']; if ($existingSim < $similarity) { $similarChunks[$chunkKey] = $chunkWithSimilarity; } } } } } // Sort by similarity score usort($similarChunks, static function (array $a, array $b): int { // Since we know similarity is added above, we can safely access it $aSimilarity = isset($a['similarity']) && is_numeric($a['similarity']) ? $a['similarity'] : 0.0; $bSimilarity = isset($b['similarity']) && is_numeric($b['similarity']) ? $b['similarity'] : 0.0; return $bSimilarity <=> $aSimilarity; }); // Apply limit $similarChunks = array_slice($similarChunks, 0, $limit); if ([] === $similarChunks) { return "## Similar Documentation\n\nNo similar documentation found (threshold: {$similarity_threshold})" . (null !== $sdk ? ' in SDK: ' . $sdk : '') . "\n\nTry:\n- Lowering the similarity threshold\n- Providing more specific content\n- Removing SDK filter for broader results"; } // Build markdown response $markdown = "## Similar Documentation\n\n"; $markdown .= sprintf('**Similarity Threshold:** %s%s', $similarity_threshold, PHP_EOL); if (null !== $sdk) { $markdown .= sprintf('**SDK Filter:** %s%s', $sdk, PHP_EOL); } $markdown .= '**Found:** ' . count($similarChunks) . " similar document(s)\n\n"; $markdown .= "---\n\n"; foreach ($similarChunks as $chunkIndex => $chunk) { $markdown .= $this->formatSimilarResult($chunk, $chunkIndex + 1); } return $markdown; }�u}�(j��searchCodeExamples�j�Kj�}�(j�}�(j�K�j�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K&uuj ]�(}�(j��$query�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $query,�j�]�u}�(j�� $language�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K uuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $language = null,�j�]�u}�(j��$include_context�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K$uuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��bool $include_context = true,�j�]�u}�(j��$limit�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $limit = 5,�j�]�u}�(j��$offset�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $offset = 0,�j�]�u}�(j��$validLanguages�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��^$validLanguages = ['php', 'go', 'python', 'java', 'csharp', 'javascript', 'typescript', null];�j�]�u}�(j��$index�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j-j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��4$index = DocumentationIndexSingleton::getInstance();�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K uuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j:j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��*$sdk = $this->mapLanguageToSdk($language);�j�]�u}�(j�� $allChunks�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jGj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$allChunks = $index->searchChunks($query, $sdk);�j�]�u}�(j�� $codeExamples�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jTj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$codeExamples = [];�j�]�u}�(j�� $allChunk�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K(uuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�K(uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jaj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $allChunk) {�j�]�u}�(j�� $chunkContent�j�K j�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jnj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��F$chunkContent = $this->getChunkContent($allChunk['chunk_id'], $index);�j�]�u}�(j��$chunkWithContent�j�K j�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j{j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$chunkWithContent = $allChunk;�j�]�u}�(j��$chunkWithContent�j�K j�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��-$chunkWithContent['content'] = $chunkContent;�j�]�u}�(j�� $examples�j�K j�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��F$examples = $this->extractCodeFromChunk($chunkWithContent, $language);�j�]�u}�(j��$example�j�K j�}�(j�}�(j�K�j�K"uj�}�(j�K�j�K*uuj�}�(j�}�(j�K�j�K"uj�}�(j�K�j�K*uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $example) {�j�]�u}�(j��$example�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$example['chunk'] = $allChunk;�j�]�u}�(j�� $codeExamples�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$codeExamples[] = $example;�j�]�u}�(j��$totalExamples�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��&$totalExamples = count($codeExamples);�j�]�u}�(j��$paginatedExamples�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��A$paginatedExamples = array_slice($codeExamples, $offset, $limit);�j�]�u}�(j�� $currentPage�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$currentPage = (int) floor($offset / $limit) + 1;�j�]�u}�(j�� $totalPages�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��2$totalPages = (int) ceil($totalExamples / $limit);�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#$markdown = "## Code Examples\n\n";�j�]�u}�(j�� $exampleIndex�j�K j�}�(j�}�(j�K�j�K'uj�}�(j�K�j�K4uuj�}�(j�}�(j�K�j�K'uj�}�(j�K�j�K4uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$exampleIndex => $example) {�j�]�u}�(j��$example�j�K j�}�(j�}�(j�K�j�K8uj�}�(j�K�j�K@uuj�}�(j�}�(j�K�j�K8uj�}�(j�K�j�K@uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $example) {�j�]�u}�(j��$exampleNumber�j�K j�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�K uj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j$j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��-$exampleNumber = $offset + $exampleIndex + 1;�j�]�u}�(j�� $prevOffset�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j1j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��'$prevOffset = max(0, $offset - $limit);�j�]�u}�(j�� $nextOffset�j�K j�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuuj�}�(j�}�(j�K�j�Kuj�}�(j�K�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j>j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$nextOffset = $offset + $limit;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�/** * Search for code examples in documentation. * * @param string $query Code pattern or concept to find * @param string|null $language Programming language filter (php, go, python, java, csharp, javascript, typescript) * @param bool $include_context Include surrounding explanatory context * @param int $limit Maximum number of examples to return (default: 5) * @param int $offset Pagination offset for results (default: 0) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted code examples with descriptions */ #[McpTool(name: 'search_code_examples')] public function searchCodeExamples( string $query, ?string $language = null, bool $include_context = true, int $limit = 5, int $offset = 0, ): string { if ('' === trim($query)) { return '❌ Search query cannot be empty'; } if (1 > $limit || 20 < $limit) { return '❌ Limit must be between 1 and 20'; } if (0 > $offset) { return '❌ Offset cannot be negative'; } $validLanguages = ['php', 'go', 'python', 'java', 'csharp', 'javascript', 'typescript', null]; if (! in_array($language, $validLanguages, true)) { return '❌ Invalid language. Must be one of: php, go, python, java, csharp, javascript, typescript'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Map language to SDK if applicable $sdk = $this->mapLanguageToSdk($language); // Search for code-related chunks $allChunks = $index->searchChunks($query, $sdk); $codeExamples = []; foreach ($allChunks as $allChunk) { // Get the full content for this chunk $chunkContent = $this->getChunkContent($allChunk['chunk_id'], $index); $chunkWithContent = $allChunk; $chunkWithContent['content'] = $chunkContent; $examples = $this->extractCodeFromChunk($chunkWithContent, $language); foreach ($examples as $example) { $example['chunk'] = $allChunk; $codeExamples[] = $example; } } $totalExamples = count($codeExamples); if (0 === $totalExamples) { return "## Code Examples No code examples found for: **{$query}**" . (null !== $language ? sprintf(' (language: %s)', $language) : '') . "\n\nTry:\n- Searching for specific method or class names\n- Using OpenFGA terminology (e.g., 'check', 'expand', 'tuples')\n- Removing language filter for broader results"; } // Apply pagination $paginatedExamples = array_slice($codeExamples, $offset, $limit); $currentPage = (int) floor($offset / $limit) + 1; $totalPages = (int) ceil($totalExamples / $limit); // Build markdown response $markdown = "## Code Examples\n\n"; $markdown .= "**Search:** `{$query}`\n"; if (null !== $language) { $markdown .= sprintf('**Language:** %s%s', $language, PHP_EOL); } $markdown .= '**Results:** Showing ' . ($offset + 1) . '-' . min($offset + $limit, $totalExamples) . " of {$totalExamples} examples\n\n"; $markdown .= "---\n\n"; foreach ($paginatedExamples as $exampleIndex => $example) { $exampleNumber = $offset + $exampleIndex + 1; $markdown .= $this->formatCodeExample($example, $exampleNumber, $include_context); } // Add pagination info if (1 < $totalPages) { $markdown .= "\n---\n\n### Pagination\n\n"; if (1 < $currentPage) { $prevOffset = max(0, $offset - $limit); $markdown .= sprintf('- **Previous page:** Use offset=%d%s', $prevOffset, PHP_EOL); } if ($currentPage < $totalPages) { $nextOffset = $offset + $limit; $markdown .= sprintf('- **Next page:** Use offset=%d%s', $nextOffset, PHP_EOL); } } return $markdown; }�u}�(j��searchDocumentation�j�Kj�}�(j�}�(j�Mj�Kuj�}�(j�Mij�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�K'uuj ]�(}�(j��$query�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jXj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $query,�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jej��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $sdk = null,�j�]�u}�(j�� $search_type�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�K'uuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jrj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� string $search_type = 'content',�j�]�u}�(j��$limit�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�K uj�}�(j�Mj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $limit = 10,�j�]�u}�(j��$offset�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�K uj�}�(j�Mj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $offset = 0,�j�]�u}�(j��$validSearchTypes�j�K j�}�(j�}�(j�M%j�Kuj�}�(j�M%j�Kuuj�}�(j�}�(j�M%j�Kuj�}�(j�M%j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��>$validSearchTypes = ['content', 'class', 'method', 'section'];�j�]�u}�(j�� $validSdks�j�K j�}�(j�}�(j�M+j�Kuj�}�(j�M+j�Kuuj�}�(j�}�(j�M+j�Kuj�}�(j�M+j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��N$validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null];�j�]�u}�(j��$index�j�K j�}�(j�}�(j�M1j�Kuj�}�(j�M1j�Kuuj�}�(j�}�(j�M1j�Kuj�}�(j�M1j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��4$index = DocumentationIndexSingleton::getInstance();�j�]�u}�(j�� $allResults�j�K j�}�(j�}�(j�M8j�Kuj�}�(j�M8j�Kuuj�}�(j�}�(j�M8j�Kuj�}�(j�M8j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��G$allResults = $this->performSearch($index, $query, $sdk, $search_type);�j�]�u}�(j�� $totalResults�j�K j�}�(j�}�(j�M9j�Kuj�}�(j�M9j�Kuuj�}�(j�}�(j�M9j�Kuj�}�(j�M9j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#$totalResults = count($allResults);�j�]�u}�(j��$paginatedResults�j�K j�}�(j�}�(j�MDj�Kuj�}�(j�MDj�Kuuj�}�(j�}�(j�MDj�Kuj�}�(j�MDj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��>$paginatedResults = array_slice($allResults, $offset, $limit);�j�]�u}�(j�� $currentPage�j�K j�}�(j�}�(j�MEj�Kuj�}�(j�MEj�Kuuj�}�(j�}�(j�MEj�Kuj�}�(j�MEj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$currentPage = (int) floor($offset / $limit) + 1;�j�]�u}�(j�� $totalPages�j�K j�}�(j�}�(j�MFj�Kuj�}�(j�MFj�Kuuj�}�(j�}�(j�MFj�Kuj�}�(j�MFj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$totalPages = (int) ceil($totalResults / $limit);�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�MIj�Kuj�}�(j�MIj�Kuuj�}�(j�}�(j�MIj�Kuj�}�(j�MIj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��2$markdown = "## Documentation Search Results\n\n";�j�]�u}�(j�� $resultIndex�j�K j�}�(j�}�(j�MTj�K&uj�}�(j�MTj�K2uuj�}�(j�}�(j�MTj�K&uj�}�(j�MTj�K2uujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$resultIndex => $result) {�j�]�u}�(j��$result�j�K j�}�(j�}�(j�MTj�K6uj�}�(j�MTj�K=uuj�}�(j�}�(j�MTj�K6uj�}�(j�MTj�K=uujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $result) {�j�]�u}�(j�� $resultNumber�j�K j�}�(j�}�(j�MUj�K uj�}�(j�MUj�Kuuj�}�(j�}�(j�MUj�K uj�}�(j�MUj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j(j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��1$resultNumber = $offset + (int) $resultIndex + 1;�j�]�u}�(j�� $prevOffset�j�K j�}�(j�}�(j�M^j�Kuj�}�(j�M^j�Kuuj�}�(j�}�(j�M^j�Kuj�}�(j�M^j�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j5j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��'$prevOffset = max(0, $offset - $limit);�j�]�u}�(j�� $nextOffset�j�K j�}�(j�}�(j�Mcj�Kuj�}�(j�Mcj�Kuuj�}�(j�}�(j�Mcj�Kuj�}�(j�Mcj�KuujjMj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jBj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$nextOffset = $offset + $limit;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jOj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�/** * Advanced documentation search with filtering and pagination. * * @param string $query Search query to find in documentation * @param string|null $sdk Filter by specific SDK (php, go, python, java, dotnet, js, laravel) * @param string $search_type Type of search: content (default), class, method, or section * @param int $limit Maximum number of results to return (default: 10) * @param int $offset Pagination offset for results (default: 0) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted search results with pagination metadata */ #[McpTool(name: 'search_documentation')] public function searchDocumentation( string $query, ?string $sdk = null, string $search_type = 'content', int $limit = 10, int $offset = 0, ): string { if ('' === trim($query)) { return '❌ Search query cannot be empty'; } if (1 > $limit || 50 < $limit) { return '❌ Limit must be between 1 and 50'; } if (0 > $offset) { return '❌ Offset cannot be negative'; } $validSearchTypes = ['content', 'class', 'method', 'section']; if (! in_array($search_type, $validSearchTypes, true)) { return '❌ Invalid search_type. Must be one of: ' . implode(', ', $validSearchTypes); } $validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null]; if (! in_array($sdk, $validSdks, true)) { return '❌ Invalid SDK. Must be one of: php, go, python, java, dotnet, js, laravel'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Get all results first for total count $allResults = $this->performSearch($index, $query, $sdk, $search_type); $totalResults = count($allResults); if (0 === $totalResults) { return "## Documentation Search Results No results found for query: **{$query}**" . (null !== $sdk ? sprintf(' (filtered by SDK: %s)', $sdk) : '') . "\n\nTry:\n- Using different keywords\n- Checking spelling\n- Using broader search terms"; } // Apply pagination $paginatedResults = array_slice($allResults, $offset, $limit); $currentPage = (int) floor($offset / $limit) + 1; $totalPages = (int) ceil($totalResults / $limit); // Build markdown response $markdown = "## Documentation Search Results\n\n"; $markdown .= "**Query:** `{$query}`\n"; if (null !== $sdk) { $markdown .= sprintf('**SDK Filter:** %s%s', $sdk, PHP_EOL); } $markdown .= sprintf('**Search Type:** %s%s', $search_type, PHP_EOL); $markdown .= '**Results:** Showing ' . ($offset + 1) . '-' . min($offset + $limit, $totalResults) . " of {$totalResults} total results\n"; $markdown .= "**Page:** {$currentPage} of {$totalPages}\n\n"; $markdown .= "---\n\n"; foreach ($paginatedResults as $resultIndex => $result) { $resultNumber = $offset + (int) $resultIndex + 1; $markdown .= $this->formatSearchResult($result, $resultNumber); } // Add pagination info if (1 < $totalPages) { $markdown .= "\n---\n\n### Pagination\n\n"; if (1 < $currentPage) { $prevOffset = max(0, $offset - $limit); $markdown .= sprintf('- **Previous page:** Use offset=%d%s', $prevOffset, PHP_EOL); } if ($currentPage < $totalPages) { $nextOffset = $offset + $limit; $markdown .= sprintf('- **Next page:** Use offset=%d%s', $nextOffset, PHP_EOL); } } return $markdown; }�u}�(j��calculateSimilarity�j�Kj�}�(j�}�(j�Mkj�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�Mrj�Kuj�}�(j�Mrj�K(uuj ]�(}�(j�� $content1�j�K j�}�(j�}�(j�Mrj�K)uj�}�(j�Mrj�K9uuj�}�(j�}�(j�Mrj�K0uj�}�(j�Mrj�K9uujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j\j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��*string $content1, string $content2): float�j�]�u}�(j�� $content2�j�K j�}�(j�}�(j�Mrj�K;uj�}�(j�Mrj�KKuuj�}�(j�}�(j�Mrj�KBuj�}�(j�Mrj�KKuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jij��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php��j�j�uj��string $content2): float�j�]�u}�(j��$terms1�j�K j�}�(j�}�(j�Myj�Kuj�}�(j�Myj�Kuuj�}�(j�}�(j�Myj�Kuj�}�(j�Myj�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jvj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��,$terms1 = $this->extractKeyTerms($content1);�j�]�u}�(j��$terms2�j�K j�}�(j�}�(j�Mzj�Kuj�}�(j�Mzj�Kuuj�}�(j�}�(j�Mzj�Kuj�}�(j�Mzj�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��,$terms2 = $this->extractKeyTerms($content2);�j�]�u}�(j�� $intersection�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��9$intersection = count(array_intersect($terms1, $terms2));�j�]�u}�(j��$union�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��<$union = count(array_unique(array_merge($terms1, $terms2)));�j�]�u}�(j��$jaccard�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��,$jaccard = (float) ($intersection / $union);�j�]�u}�(j��$phrases�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $phrases = [�j�]�u}�(j�� $phraseBonus�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�KuujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$phraseBonus = 0.0;�j�]�u}�(j��$phrase�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K$uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K$uujjQj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $phrase) {�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jSj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X/** * Calculate similarity between two pieces of content. * * @param string $content1 * @param string $content2 * @return float Similarity score between 0 and 1 */ private function calculateSimilarity(string $content1, string $content2): float { if ('' === $content1 || '' === $content2) { return 0.0; } // Extract terms from both contents $terms1 = $this->extractKeyTerms($content1); $terms2 = $this->extractKeyTerms($content2); if ([] === $terms1 || [] === $terms2) { return 0.0; } // Calculate Jaccard similarity $intersection = count(array_intersect($terms1, $terms2)); $union = count(array_unique(array_merge($terms1, $terms2))); // Union will always be at least 1 since we checked both term arrays are non-empty $jaccard = (float) ($intersection / $union); // Also check for exact phrase matches for higher similarity $phrases = [ 'authorization model', 'permission check', 'tuple creation', 'relationship tuples', 'access control', 'openfga', ]; $phraseBonus = 0.0; foreach ($phrases as $phrase) { if (false !== stripos($content1, $phrase) && false !== stripos($content2, $phrase)) { $phraseBonus += 0.1; } } // Combine scores (cap at 1.0) return min(1.0, $jaccard + $phraseBonus); }�u}�(j��extractCodeFromChunk�j�Kj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K)uuj ]�(}�(j��$chunk�j�K j�}�(j�}�(j�M�j�K*uj�}�(j�M�j�K6uuj�}�(j�}�(j�M�j�K0uj�}�(j�M�j�K6uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��'array $chunk, ?string $language): array�j�]�u}�(j�� $language�j�K j�}�(j�}�(j�M�j�K8uj�}�(j�M�j�KIuuj�}�(j�}�(j�M�j�K@uj�}�(j�M�j�KIuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $language): array�j�]�u}�(j��$content�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��f$content = isset($chunk['content']) && is_scalar($chunk['content']) ? (string) $chunk['content'] : '';�j�]�u}�(j�� $examples�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$examples = [];�j�]�u}�(j��$pattern�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��&$pattern = '/```(\w+)?\n(.*?)\n```/s';�j�]�u}�(j��$result�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j,j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��G$result = preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);�j�]�u}�(j��$match�j�K j�}�(j�}�(j�M�j�K!uj�}�(j�M�j�K'uuj�}�(j�}�(j�M�j�K!uj�}�(j�M�j�K'uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j9j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $match) {�j�]�u}�(j�� $codeLang�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jFj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$codeLang = $match[1];�j�]�u}�(j�� $codeContent�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jSj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$codeContent = $match[2];�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j`j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$langMatch = false;�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jmj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��M$langMatch = 'php' === $codeLang || false !== stripos($codeContent, '<?php');�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jzj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��L$langMatch = 'go' === $codeLang || false !== stripos($codeContent, 'func ');�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��e$langMatch = 'python' === $codeLang || 'py' === $codeLang || false !== stripos($codeContent, 'def ');�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��U$langMatch = 'java' === $codeLang || false !== stripos($codeContent, 'public class');�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��g$langMatch = 'csharp' === $codeLang || 'cs' === $codeLang || false !== stripos($codeContent, 'using ');�j�]�u}�(j�� $langMatch�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��Q$langMatch = in_array($codeLang, ['javascript', 'js', 'typescript', 'ts'], true);�j�]�u}�(j�� $examples�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$examples[] = [�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X /** * Extract code examples from a chunk. * * @param array<string, mixed> $chunk * @param string|null $language * @return array<array<string, mixed>> */ private function extractCodeFromChunk(array $chunk, ?string $language): array { $content = isset($chunk['content']) && is_scalar($chunk['content']) ? (string) $chunk['content'] : ''; $examples = []; // Match code blocks with optional language specification $pattern = '/```(\w+)?\n(.*?)\n```/s'; $result = preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); if (false !== $result && 0 < $result) { foreach ($matches as $match) { // When preg_match_all succeeds with PREG_SET_ORDER, capture groups exist // Optional groups will be empty strings if they don't match /** @var array{0: string, 1: string, 2: string} $match */ $codeLang = $match[1]; $codeContent = $match[2]; // Filter by language if specified if (null !== $language) { $langMatch = false; switch ($language) { case 'php': $langMatch = 'php' === $codeLang || false !== stripos($codeContent, '<?php'); break; case 'go': $langMatch = 'go' === $codeLang || false !== stripos($codeContent, 'func '); break; case 'python': $langMatch = 'python' === $codeLang || 'py' === $codeLang || false !== stripos($codeContent, 'def '); break; case 'java': $langMatch = 'java' === $codeLang || false !== stripos($codeContent, 'public class'); break; case 'csharp': $langMatch = 'csharp' === $codeLang || 'cs' === $codeLang || false !== stripos($codeContent, 'using '); break; case 'javascript': case 'typescript': $langMatch = in_array($codeLang, ['javascript', 'js', 'typescript', 'ts'], true); break; } if (! $langMatch) { continue; } } $examples[] = [ 'language' => '' !== $codeLang ? $codeLang : 'unknown', 'code' => $codeContent, 'context' => $this->extractContext($content, $match[0]), ]; } } return $examples; }�u}�(j��extractContext�j�Kj�}�(j�}�(j�M�j�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K#uuj ]�(}�(j��$content�j�K j�}�(j�}�(j�M�j�K$uj�}�(j�M�j�K3uuj�}�(j�}�(j�M�j�K+uj�}�(j�M�j�K3uujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��+string $content, string $codeBlock): string�j�]�u}�(j�� $codeBlock�j�K j�}�(j�}�(j�M�j�K5uj�}�(j�M�j�KFuuj�}�(j�}�(j�M�j�K<uj�}�(j�M�j�KFuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $codeBlock): string�j�]�u}�(j�� $position�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��)$position = strpos($content, $codeBlock);�j�]�u}�(j�� $beforeStart�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��'$beforeStart = max(0, $position - 200);�j�]�u}�(j�� $beforeText�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��G$beforeText = substr($content, $beforeStart, $position - $beforeStart);�j�]�u}�(j�� $afterStart�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��-$afterStart = $position + strlen($codeBlock);�j�]�u}�(j�� $afterText�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j# j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$afterText = substr($content, $afterStart, 200);�j�]�u}�(j�� $beforeText�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j0 j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��B$beforeText = trim(preg_replace('/\s+/', ' ', $beforeText) ?? '');�j�]�u}�(j�� $afterText�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j= j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��@$afterText = trim(preg_replace('/\s+/', ' ', $afterText) ?? '');�j�]�u}�(j��$context�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuujj�j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jJ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$context = '';�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�Xn/** * Extract context around code. * * @param string $content * @param string $codeBlock */ private function extractContext(string $content, string $codeBlock): string { $position = strpos($content, $codeBlock); if (false === $position) { return ''; } // Get text before the code block (up to 200 chars) $beforeStart = max(0, $position - 200); $beforeText = substr($content, $beforeStart, $position - $beforeStart); // Get text after the code block (up to 200 chars) $afterStart = $position + strlen($codeBlock); $afterText = substr($content, $afterStart, 200); // Clean up and combine $beforeText = trim(preg_replace('/\s+/', ' ', $beforeText) ?? ''); $afterText = trim(preg_replace('/\s+/', ' ', $afterText) ?? ''); $context = ''; if ('' !== $beforeText) { $context .= '...' . $beforeText; } $context .= ' [CODE] '; if ('' !== $afterText) { $context .= $afterText . '...'; } return trim($context); }�u}�(j��extractKeyTerms�j�Kj�}�(j�}�(j�Mj�Kuj�}�(j�M@j�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�K$uuj ]�(}�(j��$content�j�K j�}�(j�}�(j�Mj�K%uj�}�(j�Mj�K4uuj�}�(j�}�(j�Mj�K,uj�}�(j�Mj�K4uujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jd j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $content): array�j�]�u}�(j�� $cleanContent�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jq j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?$cleanContent = preg_replace('/```[\s\S]*?```/', '', $content);�j�]�u}�(j�� $cleanContent�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j~ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$cleanContent ??= '';�j�]�u}�(j�� $cleanContent�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��E$cleanContent = preg_replace('/[^a-zA-Z0-9\s]/', ' ', $cleanContent);�j�]�u}�(j�� $cleanContent�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$cleanContent ??= '';�j�]�u}�(j��$words�j�K j�}�(j�}�(j�M!j�Kuj�}�(j�M!j�Kuuj�}�(j�}�(j�M!j�Kuj�}�(j�M!j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��8$words = preg_split('/\s+/', strtolower($cleanContent));�j�]�u}�(j��$words�j�K j�}�(j�}�(j�M"j�Kuj�}�(j�M"j�Kuuj�}�(j�}�(j�M"j�Kuj�}�(j�M"j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��($words = false !== $words ? $words : [];�j�]�u}�(j�� $stopWords�j�K j�}�(j�}�(j�M%j�Kuj�}�(j�M%j�Kuuj�}�(j�}�(j�M%j�Kuj�}�(j�M%j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�$stopWords = ['the', 'is', 'at', 'which', 'on', 'and', 'a', 'an', 'as', 'are', 'was', 'were', 'been', 'be', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'what', 'which', 'who', 'when', 'where', 'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'in', 'of', 'to', 'for', 'with', 'from', 'up', 'out', 'if', 'about', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between', 'under', 'again', 'further', 'then', 'once'];�j�]�u}�(j�� $termCounts�j�K j�}�(j�}�(j�M'j�Kuj�}�(j�M'j�Kuuj�}�(j�}�(j�M'j�Kuj�}�(j�M'j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$termCounts = [];�j�]�u}�(j��$word�j�K j�}�(j�}�(j�M)j�Kuj�}�(j�M)j�K uuj�}�(j�}�(j�M)j�Kuj�}�(j�M)j�K uujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$word) {�j�]�u}�(j�� $termCounts�j�K j�}�(j�}�(j�M,j�Kuj�}�(j�M,j�Kuuj�}�(j�}�(j�M,j�Kuj�}�(j�M,j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$termCounts[$word] = 0;�j�]�u}�(j��$word�j�K j�}�(j�}�(j�M,j�K uj�}�(j�M,j�K%uuj�}�(j�}�(j�M,j�K uj�}�(j�M,j�K%uujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $word] = 0;�j�]�u}�(j�� $keyTerms�j�K j�}�(j�}�(j�M4j�Kuj�}�(j�M4j�Kuuj�}�(j�}�(j�M4j�Kuj�}�(j�M4j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��8$keyTerms = array_keys(array_slice($termCounts, 0, 10));�j�]�u}�(j�� $openfgaTerms�j�K j�}�(j�}�(j�M7j�Kuj�}�(j�M7j�Kuuj�}�(j�}�(j�M7j�Kuj�}�(j�M7j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj���$openfgaTerms = ['openfga', 'authorization', 'permission', 'tuple', 'relation', 'check', 'expand', 'store', 'model', 'user', 'object'];�j�]�u}�(j�� $openfgaTerm�j�K j�}�(j�}�(j�M9j�K"uj�}�(j�M9j�K.uuj�}�(j�}�(j�M9j�K"uj�}�(j�M9j�K.uujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$openfgaTerm) {�j�]�u}�(j�� $keyTerms�j�K j�}�(j�}�(j�M;j�Kuj�}�(j�M;j�Kuuj�}�(j�}�(j�M;j�Kuj�}�(j�M;j�KuujjY j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j' j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$keyTerms[] = $openfgaTerm;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j[ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X�/** * Extract key terms from content for similarity matching. * * @param string $content * @return array<string> */ private function extractKeyTerms(string $content): array { // Remove code blocks and special characters $cleanContent = preg_replace('/```[\s\S]*?```/', '', $content); $cleanContent ??= ''; $cleanContent = preg_replace('/[^a-zA-Z0-9\s]/', ' ', $cleanContent); $cleanContent ??= ''; // Extract words $words = preg_split('/\s+/', strtolower($cleanContent)); $words = false !== $words ? $words : []; // Filter out common words and short words $stopWords = ['the', 'is', 'at', 'which', 'on', 'and', 'a', 'an', 'as', 'are', 'was', 'were', 'been', 'be', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'what', 'which', 'who', 'when', 'where', 'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'in', 'of', 'to', 'for', 'with', 'from', 'up', 'out', 'if', 'about', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between', 'under', 'again', 'further', 'then', 'once']; $termCounts = []; foreach ($words as $word) { if (2 < strlen($word) && ! in_array($word, $stopWords, true)) { if (! isset($termCounts[$word])) { $termCounts[$word] = 0; } ++$termCounts[$word]; } } // Sort by frequency and take top terms arsort($termCounts); $keyTerms = array_keys(array_slice($termCounts, 0, 10)); // Add OpenFGA-specific terms if present $openfgaTerms = ['openfga', 'authorization', 'permission', 'tuple', 'relation', 'check', 'expand', 'store', 'model', 'user', 'object']; foreach ($openfgaTerms as $openfgaTerm) { if (false !== stripos($content, $openfgaTerm) && ! in_array($openfgaTerm, $keyTerms, true)) { $keyTerms[] = $openfgaTerm; } } return array_slice($keyTerms, 0, 15); }�u}�(j��formatCodeExample�j�Kj�}�(j�}�(j�MBj�Kuj�}�(j�Mvj�Kuuj�}�(j�}�(j�MIj�Kuj�}�(j�MIj�K&uuj ]�(}�(j��$example�j�K j�}�(j�}�(j�MIj�K'uj�}�(j�MIj�K5uuj�}�(j�}�(j�MIj�K-uj�}�(j�MIj�K5uujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jA j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��:array $example, int $number, bool $includeContext): string�j�]�u}�(j��$number�j�K j�}�(j�}�(j�MIj�K7uj�}�(j�MIj�KBuuj�}�(j�}�(j�MIj�K;uj�}�(j�MIj�KBuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jN j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��*int $number, bool $includeContext): string�j�]�u}�(j��$includeContext�j�K j�}�(j�}�(j�MIj�KDuj�}�(j�MIj�KXuuj�}�(j�}�(j�MIj�KIuj�}�(j�MIj�KXuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j[ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��bool $includeContext): string�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�MKj�Kuj�}�(j�MKj�Kuuj�}�(j�}�(j�MKj�Kuj�}�(j�MKj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jh j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��($markdown = "### Example {$number}\n\n";�j�]�u}�(j��$chunk�j�K j�}�(j�}�(j�MMj�Kuj�}�(j�MMj�Kuuj�}�(j�}�(j�MMj�Kuj�}�(j�MMj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�ju j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��Z$chunk = isset($example['chunk']) && is_array($example['chunk']) ? $example['chunk'] : [];�j�]�u}�(j�� $chunkSdk�j�K j�}�(j�}�(j�MQj�K uj�}�(j�MQj�Kuuj�}�(j�}�(j�MQj�K uj�}�(j�MQj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��C$chunkSdk = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : '';�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�MVj�Kuj�}�(j�MVj�Kuuj�}�(j�}�(j�MVj�Kuj�}�(j�MVj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : [];�j�]�u}�(j�� $chunkClass�j�K j�}�(j�}�(j�MYj�K uj�}�(j�MYj�Kuuj�}�(j�}�(j�MYj�K uj�}�(j�MYj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��O$chunkClass = is_scalar($metadata['class']) ? (string) $metadata['class'] : '';�j�]�u}�(j�� $chunkMethod�j�K j�}�(j�}�(j�M]j�Kuj�}�(j�M]j�Kuuj�}�(j�}�(j�M]j�Kuj�}�(j�M]j�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��R$chunkMethod = is_scalar($metadata['method']) ? (string) $metadata['method'] : '';�j�]�u}�(j�� $exampleLang�j�K j�}�(j�}�(j�Mdj�K uj�}�(j�Mdj�Kuuj�}�(j�}�(j�Mdj�K uj�}�(j�Mdj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��T$exampleLang = is_scalar($example['language']) ? (string) $example['language'] : '';�j�]�u}�(j��$context�j�K j�}�(j�}�(j�Mlj�K uj�}�(j�Mlj�Kuuj�}�(j�}�(j�Mlj�K uj�}�(j�Mlj�Kuujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��N$context = is_scalar($example['context']) ? (string) $example['context'] : '';�j�]�u}�(j��$lang�j�K j�}�(j�}�(j�Mqj�Kuj�}�(j�Mqj�K uuj�}�(j�}�(j�Mqj�Kuj�}�(j�Mqj�K uujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��l$lang = isset($example['language']) && is_scalar($example['language']) ? (string) $example['language'] : '';�j�]�u}�(j��$code�j�K j�}�(j�}�(j�Mrj�Kuj�}�(j�Mrj�K uuj�}�(j�}�(j�Mrj�Kuj�}�(j�Mrj�K uujj6 j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$code = isset($example['code']) && is_scalar($example['code']) ? (string) $example['code'] : '';�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j8 j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X: /** * Format a code example as markdown. * * @param array<string, mixed> $example * @param int $number * @param bool $includeContext */ private function formatCodeExample(array $example, int $number, bool $includeContext): string { $markdown = "### Example {$number}\n\n"; $chunk = isset($example['chunk']) && is_array($example['chunk']) ? $example['chunk'] : []; // Add metadata if (isset($chunk['sdk']) && '' !== $chunk['sdk']) { $chunkSdk = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : ''; $markdown .= "**SDK:** `{$chunkSdk}` \n"; } // Access class and method from metadata $metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $chunkClass = is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; $markdown .= sprintf('**Class:** `%s`', $chunkClass); if (isset($metadata['method']) && '' !== $metadata['method']) { $chunkMethod = is_scalar($metadata['method']) ? (string) $metadata['method'] : ''; $markdown .= sprintf(' **Method:** `%s`', $chunkMethod); } $markdown .= " \n"; } if (isset($example['language']) && '' !== $example['language'] && 'unknown' !== $example['language']) { $exampleLang = is_scalar($example['language']) ? (string) $example['language'] : ''; $markdown .= "**Language:** `{$exampleLang}` \n"; } $markdown .= "\n"; // Add context if requested if ($includeContext && isset($example['context']) && '' !== $example['context']) { $context = is_scalar($example['context']) ? (string) $example['context'] : ''; $markdown .= "**Context:**\n> " . str_replace('[CODE]', '*(see code below)*', $context) . "\n\n"; } // Add code $lang = isset($example['language']) && is_scalar($example['language']) ? (string) $example['language'] : ''; $code = isset($example['code']) && is_scalar($example['code']) ? (string) $example['code'] : ''; $markdown .= "```{$lang}\n{$code}\n```\n"; return $markdown . "\n---\n\n"; }�u}�(j��formatSearchResult�j�Kj�}�(j�}�(j�Mxj�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M~j�Kuj�}�(j�M~j�K'uuj ]�(}�(j��$result�j�K j�}�(j�}�(j�M~j�K(uj�}�(j�M~j�K5uuj�}�(j�}�(j�M~j�K.uj�}�(j�M~j�K5uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#array $result, int $number): string�j�]�u}�(j��$number�j�K j�}�(j�}�(j�M~j�K7uj�}�(j�M~j�KBuuj�}�(j�}�(j�M~j�K;uj�}�(j�M~j�KBuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $number): string�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��)$markdown = sprintf('### %d. ', $number);�j�]�u}�(j��$title�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $title = '';�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j+ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��c$metadata = isset($result['metadata']) && is_array($result['metadata']) ? $result['metadata'] : [];�j�]�u}�(j��$sdkName�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j8 j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��D$sdkName = is_scalar($result['sdk']) ? (string) $result['sdk'] : '';�j�]�u}�(j�� $sourceName�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jE j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��M$sourceName = is_scalar($result['source']) ? (string) $result['source'] : '';�j�]�u}�(j�� $scoreValue�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jR j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��L$scoreValue = is_numeric($result['score']) ? (float) $result['score'] : 0.0;�j�]�u}�(j��$preview�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j_ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��L$preview = is_scalar($result['preview']) ? (string) $result['preview'] : '';�j�]�u}�(j��$preview�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jl j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��,$preview = substr($preview, 0, 497) . '...';�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jy j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$sdk = isset($result['sdk']) && is_scalar($result['sdk']) ? (string) $result['sdk'] : 'unknown';�j�]�u}�(j��$id�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��n$id = isset($result['chunk_id']) && is_scalar($result['chunk_id']) ? (string) $result['chunk_id'] : 'unknown';�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X� /** * Format a search result as markdown. * * @param array<string, mixed> $result * @param int $number */ private function formatSearchResult(array $result, int $number): string { $markdown = sprintf('### %d. ', $number); // Build title based on available metadata $title = ''; $metadata = isset($result['metadata']) && is_array($result['metadata']) ? $result['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $title .= is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; if (isset($metadata['method']) && '' !== $metadata['method']) { $title .= '::' . (is_scalar($metadata['method']) ? (string) $metadata['method'] : ''); } } elseif (isset($metadata['section']) && '' !== $metadata['section']) { $title .= is_scalar($metadata['section']) ? (string) $metadata['section'] : ''; } else { $title .= 'Documentation Chunk'; } $markdown .= $title . "\n\n"; // Add metadata if (isset($result['sdk']) && '' !== $result['sdk']) { $sdkName = is_scalar($result['sdk']) ? (string) $result['sdk'] : ''; $markdown .= "**SDK:** `{$sdkName}` \n"; } if (isset($result['source']) && '' !== $result['source']) { $sourceName = is_scalar($result['source']) ? (string) $result['source'] : ''; $markdown .= "**Source:** `{$sourceName}` \n"; } if (isset($result['score']) && 0.0 !== $result['score']) { $scoreValue = is_numeric($result['score']) ? (float) $result['score'] : 0.0; $markdown .= '**Relevance:** ' . (string) round($scoreValue * 100.0) . "% \n"; } $markdown .= "\n"; // Add preview if (isset($result['preview']) && '' !== $result['preview']) { $preview = is_scalar($result['preview']) ? (string) $result['preview'] : ''; // Limit preview length if (500 < strlen($preview)) { $preview = substr($preview, 0, 497) . '...'; } $markdown .= "**Preview:**\n```\n{$preview}\n```\n"; } // Add navigation if (isset($result['chunk_id']) && '' !== $result['chunk_id']) { $sdk = isset($result['sdk']) && is_scalar($result['sdk']) ? (string) $result['sdk'] : 'unknown'; $id = isset($result['chunk_id']) && is_scalar($result['chunk_id']) ? (string) $result['chunk_id'] : 'unknown'; $markdown .= "\n**Reference:** `{$sdk}::{$id}`\n"; } return $markdown . "\n---\n\n"; }�u}�(j��formatSimilarResult�j�Kj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K(uuj ]�(}�(j��$chunk�j�K j�}�(j�}�(j�M�j�K)uj�}�(j�M�j�K5uuj�}�(j�}�(j�M�j�K/uj�}�(j�M�j�K5uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"array $chunk, int $number): string�j�]�u}�(j��$number�j�K j�}�(j�}�(j�M�j�K7uj�}�(j�M�j�KBuuj�}�(j�}�(j�M�j�K;uj�}�(j�M�j�KBuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��int $number): string�j�]�u}�(j�� $markdown�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��)$markdown = sprintf('### %d. ', $number);�j�]�u}�(j��$title�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $title = '';�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��`$metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : [];�j�]�u}�(j��$chunkSdkValue�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��H$chunkSdkValue = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : '';�j�]�u}�(j�� $simScore�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��R$simScore = is_numeric($chunk['similarity']) ? (float) $chunk['similarity'] : 0.0;�j�]�u}�(j�� $sourceValue�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��L$sourceValue = is_scalar($chunk['source']) ? (string) $chunk['source'] : '';�j�]�u}�(j��$preview�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��J$preview = is_scalar($chunk['content']) ? (string) $chunk['content'] : '';�j�]�u}�(j��$preview�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��,$preview = substr($preview, 0, 797) . '...';�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j" j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��]$sdk = isset($chunk['sdk']) && is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : 'unknown';�j�]�u}�(j��$id�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j/ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��k$id = isset($chunk['chunk_id']) && is_scalar($chunk['chunk_id']) ? (string) $chunk['chunk_id'] : 'unknown';�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X� /** * Format a similar documentation result as markdown. * * @param array<string, mixed> $chunk * @param int $number */ private function formatSimilarResult(array $chunk, int $number): string { $markdown = sprintf('### %d. ', $number); // Build title $title = ''; $metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $title .= is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; if (isset($metadata['method']) && '' !== $metadata['method']) { $title .= '::' . (is_scalar($metadata['method']) ? (string) $metadata['method'] : ''); } } elseif (isset($metadata['section']) && '' !== $metadata['section']) { $title .= is_scalar($metadata['section']) ? (string) $metadata['section'] : ''; } else { $title .= 'Related Documentation'; } $markdown .= $title . "\n\n"; // Add metadata if (isset($chunk['sdk']) && '' !== $chunk['sdk']) { $chunkSdkValue = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : ''; $markdown .= "**SDK:** `{$chunkSdkValue}` \n"; } if (isset($chunk['similarity']) && 0.0 !== $chunk['similarity']) { $simScore = is_numeric($chunk['similarity']) ? (float) $chunk['similarity'] : 0.0; $markdown .= '**Similarity Score:** ' . (string) round($simScore * 100.0) . "% \n"; } if (isset($chunk['source']) && '' !== $chunk['source']) { $sourceValue = is_scalar($chunk['source']) ? (string) $chunk['source'] : ''; $markdown .= "**Source:** `{$sourceValue}` \n"; } $markdown .= "\n"; // Add content preview if (isset($chunk['content']) && '' !== $chunk['content']) { $preview = is_scalar($chunk['content']) ? (string) $chunk['content'] : ''; // Limit preview length if (800 < strlen($preview)) { $preview = substr($preview, 0, 797) . '...'; } $markdown .= "**Content:**\n\n" . $preview . "\n"; } // Add reference if (isset($chunk['chunk_id']) && '' !== $chunk['chunk_id']) { $sdk = isset($chunk['sdk']) && is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : 'unknown'; $id = isset($chunk['chunk_id']) && is_scalar($chunk['chunk_id']) ? (string) $chunk['chunk_id'] : 'unknown'; $markdown .= "\n**Reference:** `{$sdk}::{$id}`\n"; } return $markdown . "\n---\n\n"; }�u}�(j��getChunkContent�j�Kj�}�(j�}�(j�M�j�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�K$uuj ]�(}�(j��$chunkId�j�K j�}�(j�}�(j�Mj�K%uj�}�(j�Mj�K4uuj�}�(j�}�(j�Mj�K,uj�}�(j�Mj�K4uujj> j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jI j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��3string $chunkId, DocumentationIndex $index): string�j�]�u}�(j��$index�j�K j�}�(j�}�(j�Mj�K6uj�}�(j�Mj�KOuuj�}�(j�}�(j�Mj�KIuj�}�(j�Mj�KOuujj> j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jV j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"DocumentationIndex $index): string�j�]�u}�(j��$chunk�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuujj> j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jc j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��($chunk = $index->getChunkById($chunkId);�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j@ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X/** * Get the full content of a chunk by its ID. * * @param string $chunkId * @param DocumentationIndex $index */ private function getChunkContent(string $chunkId, DocumentationIndex $index): string { // For now, we'll use the chunk ID to get content // In a real implementation, we'd fetch this from the index $chunk = $index->getChunkById($chunkId); if (null === $chunk) { return ''; } return $chunk['content'] ?? ''; }�u}�(j��mapLanguageToSdk�j�Kj�}�(j�}�(j�Mj�Kuj�}�(j�M'j�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�K%uuj ]�(}�(j�� $language�j�K j�}�(j�}�(j�Mj�K&uj�}�(j�Mj�K7uuj�}�(j�}�(j�Mj�K.uj�}�(j�Mj�K7uujjr j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j} j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $language): ?string�j�]�u}�(j��$mapping�j�K j�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuuj�}�(j�}�(j�Mj�Kuj�}�(j�Mj�Kuujjr j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $mapping = [�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jt j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X/** * Map programming language to SDK. * * @param string|null $language */ private function mapLanguageToSdk(?string $language): ?string { if (null === $language) { return null; } $mapping = [ 'php' => 'php', 'go' => 'go', 'python' => 'python', 'java' => 'java', 'csharp' => 'dotnet', 'javascript' => 'js', 'typescript' => 'js', ]; return $mapping[$language] ?? null; }�u}�(j�� performSearch�j�Kj�}�(j�}�(j�M)j�Kuj�}�(j�M=j�Kuuj�}�(j�}�(j�M5j�Kuj�}�(j�M5j�K"uuj ]�(}�(j��$index�j�K j�}�(j�}�(j�M5j�K#uj�}�(j�M5j�K<uuj�}�(j�}�(j�M5j�K6uj�}�(j�M5j�K<uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��RDocumentationIndex $index, string $query, ?string $sdk, string $searchType): array�j�]�u}�(j��$query�j�K j�}�(j�}�(j�M5j�K>uj�}�(j�M5j�KKuuj�}�(j�}�(j�M5j�KEuj�}�(j�M5j�KKuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��7string $query, ?string $sdk, string $searchType): array�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�M5j�KMuj�}�(j�M5j�KYuuj�}�(j�}�(j�M5j�KUuj�}�(j�M5j�KYuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��(?string $sdk, string $searchType): array�j�]�u}�(j�� $searchType�j�K j�}�(j�}�(j�M5j�K[uj�}�(j�M5j�Kmuuj�}�(j�}�(j�M5j�Kbuj�}�(j�M5j�Kmuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��string $searchType): array�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�X /** * Perform search based on search type. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * @param string $searchType * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function performSearch(DocumentationIndex $index, string $query, ?string $sdk, string $searchType): array { return match ($searchType) { 'class' => $this->searchForClasses($index, $query, $sdk), 'method' => $this->searchForMethods($index, $query, $sdk), 'section' => $this->searchForSections($index, $query, $sdk), default => $index->searchChunks($query, $sdk), }; }�u}�(j��searchForClasses�j�Kj�}�(j�}�(j�M?j�Kuj�}�(j�MXj�Kuuj�}�(j�}�(j�MJj�Kuj�}�(j�MJj�K%uuj ]�(}�(j��$index�j�K j�}�(j�}�(j�MJj�K&uj�}�(j�MJj�K?uuj�}�(j�}�(j�MJj�K9uj�}�(j�MJj�K?uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��>DocumentationIndex $index, string $query, ?string $sdk): array�j�]�u}�(j��$query�j�K j�}�(j�}�(j�MJj�KAuj�}�(j�MJj�KNuuj�}�(j�}�(j�MJj�KHuj�}�(j�MJj�KNuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#string $query, ?string $sdk): array�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�MJj�KPuj�}�(j�MJj�K\uuj�}�(j�}�(j�MJj�KXuj�}�(j�MJj�K\uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $sdk): array�j�]�u}�(j�� $allChunks�j�K j�}�(j�}�(j�MLj�Kuj�}�(j�MLj�Kuuj�}�(j�}�(j�MLj�Kuj�}�(j�MLj�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$allChunks = $index->searchChunks($query, $sdk);�j�]�u}�(j�� $classResults�j�K j�}�(j�}�(j�MMj�Kuj�}�(j�MMj�Kuuj�}�(j�}�(j�MMj�Kuj�}�(j�MMj�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$classResults = [];�j�]�u}�(j�� $allChunk�j�K j�}�(j�}�(j�MOj�Kuj�}�(j�MOj�K(uuj�}�(j�}�(j�MOj�Kuj�}�(j�MOj�K(uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j& j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $allChunk) {�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�MPj�K uj�}�(j�MPj�Kuuj�}�(j�}�(j�MPj�K uj�}�(j�MPj�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j3 j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php��Lj�j�uj��"$metadata = $allChunk['metadata'];�j�]�u}�(j�� $classResults�j�K j�}�(j�}�(j�MSj�Kuj�}�(j�MSj�Kuuj�}�(j�}�(j�MSj�Kuj�}�(j�MSj�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j@ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$classResults[] = $allChunk;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�XE/** * Search specifically for classes. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForClasses(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $classResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['class']) && '' !== $metadata['class'] && is_scalar($metadata['class']) && false !== stripos((string) $metadata['class'], $query)) { $classResults[] = $allChunk; } } return $classResults; }�u}�(j��searchForMethods�j�Kj�}�(j�}�(j�MZj�Kuj�}�(j�Msj�Kuuj�}�(j�}�(j�Mej�Kuj�}�(j�Mej�K%uuj ]�(}�(j��$index�j�K j�}�(j�}�(j�Mej�K&uj�}�(j�Mej�K?uuj�}�(j�}�(j�Mej�K9uj�}�(j�Mej�K?uujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jZ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��>DocumentationIndex $index, string $query, ?string $sdk): array�j�]�u}�(j��$query�j�K j�}�(j�}�(j�Mej�KAuj�}�(j�Mej�KNuuj�}�(j�}�(j�Mej�KHuj�}�(j�Mej�KNuujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jg j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#string $query, ?string $sdk): array�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�Mej�KPuj�}�(j�Mej�K\uuj�}�(j�}�(j�Mej�KXuj�}�(j�Mej�K\uujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jt j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $sdk): array�j�]�u}�(j�� $allChunks�j�K j�}�(j�}�(j�Mgj�Kuj�}�(j�Mgj�Kuuj�}�(j�}�(j�Mgj�Kuj�}�(j�Mgj�KuujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$allChunks = $index->searchChunks($query, $sdk);�j�]�u}�(j��$methodResults�j�K j�}�(j�}�(j�Mhj�Kuj�}�(j�Mhj�Kuuj�}�(j�}�(j�Mhj�Kuj�}�(j�Mhj�KuujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$methodResults = [];�j�]�u}�(j�� $allChunk�j�K j�}�(j�}�(j�Mjj�Kuj�}�(j�Mjj�K(uuj�}�(j�}�(j�Mjj�Kuj�}�(j�Mjj�K(uujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $allChunk) {�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�Mkj�K uj�}�(j�Mkj�Kuuj�}�(j�}�(j�Mkj�K uj�}�(j�Mkj�KuujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"$metadata = $allChunk['metadata'];�j�]�u}�(j��$methodResults�j�K j�}�(j�}�(j�Mnj�Kuj�}�(j�Mnj�Kuuj�}�(j�}�(j�Mnj�Kuj�}�(j�Mnj�KuujjO j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$methodResults[] = $allChunk;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jQ j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�XL/** * Search specifically for methods. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForMethods(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $methodResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['method']) && '' !== $metadata['method'] && is_scalar($metadata['method']) && false !== stripos((string) $metadata['method'], $query)) { $methodResults[] = $allChunk; } } return $methodResults; }�u}�(j��searchForSections�j�Kj�}�(j�}�(j�Muj�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K&uuj ]�(}�(j��$index�j�K j�}�(j�}�(j�M�j�K'uj�}�(j�M�j�K@uuj�}�(j�}�(j�M�j�K:uj�}�(j�M�j�K@uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��>DocumentationIndex $index, string $query, ?string $sdk): array�j�]�u}�(j��$query�j�K j�}�(j�}�(j�M�j�KBuj�}�(j�M�j�KOuuj�}�(j�}�(j�M�j�KIuj�}�(j�M�j�KOuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��#string $query, ?string $sdk): array�j�]�u}�(j��$sdk�j�K j�}�(j�}�(j�M�j�KQuj�}�(j�M�j�K]uuj�}�(j�}�(j�M�j�KYuj�}�(j�M�j�K]uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��?string $sdk): array�j�]�u}�(j�� $allChunks�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��0$allChunks = $index->searchChunks($query, $sdk);�j�]�u}�(j��$sectionResults�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$sectionResults = [];�j�]�u}�(j�� $allChunk�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K(uuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�K(uujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�� $allChunk) {�j�]�u}�(j�� $metadata�j�K j�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�K uj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��"$metadata = $allChunk['metadata'];�j�]�u}�(j��$sectionResults�j�K j�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuuj�}�(j�}�(j�M�j�Kuj�}�(j�M�j�Kuujj� j�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j*j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj��$sectionResults[] = $allChunk;�j�]�uejjj�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j� j��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�XU/** * Search specifically for sections. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForSections(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $sectionResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['section']) && '' !== $metadata['section'] && is_scalar($metadata['section']) && false !== stripos((string) $metadata['section'], $query)) { $sectionResults[] = $allChunk; } } return $sectionResults; }�uej�}�(j��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�jj��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�j�j�uj�Xc�final readonly class DocumentationTools extends AbstractTools { public function __construct( /** @phpstan-ignore property.onlyWritten */ private ClientInterface $client, ) { } /** * Find documentation similar to provided content. * * @param string $content Reference content to find similar documentation * @param string|null $sdk Limit search to specific SDK * @param float $similarity_threshold Minimum similarity score (0.0-1.0, default: 0.5) * @param int $limit Maximum number of results (default: 5) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted related documentation */ #[McpTool(name: 'find_similar_documentation')] public function findSimilarDocumentation( string $content, ?string $sdk = null, float $similarity_threshold = 0.5, int $limit = 5, ): string { if ('' === trim($content)) { return '❌ Content cannot be empty'; } if (0.0 > $similarity_threshold || 1.0 < $similarity_threshold) { return '❌ Similarity threshold must be between 0.0 and 1.0'; } if (1 > $limit || 20 < $limit) { return '❌ Limit must be between 1 and 20'; } $validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null]; if (! in_array($sdk, $validSdks, true)) { return '❌ Invalid SDK. Must be one of: php, go, python, java, dotnet, js, laravel'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Extract key terms from content for similarity matching $keyTerms = $this->extractKeyTerms($content); if ([] === $keyTerms) { return '❌ Could not extract meaningful terms from the provided content'; } // Search for similar content using key terms /** @var array<string, array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>, similarity?: float, content?: string}> $similarChunks */ $similarChunks = []; foreach ($keyTerms as $keyTerm) { $chunks = $index->searchChunks($keyTerm, $sdk, $limit * 2); foreach ($chunks as $chunk) { // Get content from the chunk to calculate similarity // We need to get the actual content - the preview is just a snippet $chunkContent = $this->getChunkContent($chunk['chunk_id'], $index); $similarity = $this->calculateSimilarity($content, $chunkContent); if ($similarity >= $similarity_threshold) { // Add similarity and content to the chunk $chunkWithSimilarity = $chunk; $chunkWithSimilarity['similarity'] = $similarity; $chunkWithSimilarity['content'] = $chunkContent; $chunkKey = $chunk['sdk'] . '::' . $chunk['chunk_id']; if (! isset($similarChunks[$chunkKey])) { $similarChunks[$chunkKey] = $chunkWithSimilarity; } elseif (isset($similarChunks[$chunkKey]['similarity'])) { $existingSim = $similarChunks[$chunkKey]['similarity']; if ($existingSim < $similarity) { $similarChunks[$chunkKey] = $chunkWithSimilarity; } } } } } // Sort by similarity score usort($similarChunks, static function (array $a, array $b): int { // Since we know similarity is added above, we can safely access it $aSimilarity = isset($a['similarity']) && is_numeric($a['similarity']) ? $a['similarity'] : 0.0; $bSimilarity = isset($b['similarity']) && is_numeric($b['similarity']) ? $b['similarity'] : 0.0; return $bSimilarity <=> $aSimilarity; }); // Apply limit $similarChunks = array_slice($similarChunks, 0, $limit); if ([] === $similarChunks) { return "## Similar Documentation\n\nNo similar documentation found (threshold: {$similarity_threshold})" . (null !== $sdk ? ' in SDK: ' . $sdk : '') . "\n\nTry:\n- Lowering the similarity threshold\n- Providing more specific content\n- Removing SDK filter for broader results"; } // Build markdown response $markdown = "## Similar Documentation\n\n"; $markdown .= sprintf('**Similarity Threshold:** %s%s', $similarity_threshold, PHP_EOL); if (null !== $sdk) { $markdown .= sprintf('**SDK Filter:** %s%s', $sdk, PHP_EOL); } $markdown .= '**Found:** ' . count($similarChunks) . " similar document(s)\n\n"; $markdown .= "---\n\n"; foreach ($similarChunks as $chunkIndex => $chunk) { $markdown .= $this->formatSimilarResult($chunk, $chunkIndex + 1); } return $markdown; } /** * Search for code examples in documentation. * * @param string $query Code pattern or concept to find * @param string|null $language Programming language filter (php, go, python, java, csharp, javascript, typescript) * @param bool $include_context Include surrounding explanatory context * @param int $limit Maximum number of examples to return (default: 5) * @param int $offset Pagination offset for results (default: 0) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted code examples with descriptions */ #[McpTool(name: 'search_code_examples')] public function searchCodeExamples( string $query, ?string $language = null, bool $include_context = true, int $limit = 5, int $offset = 0, ): string { if ('' === trim($query)) { return '❌ Search query cannot be empty'; } if (1 > $limit || 20 < $limit) { return '❌ Limit must be between 1 and 20'; } if (0 > $offset) { return '❌ Offset cannot be negative'; } $validLanguages = ['php', 'go', 'python', 'java', 'csharp', 'javascript', 'typescript', null]; if (! in_array($language, $validLanguages, true)) { return '❌ Invalid language. Must be one of: php, go, python, java, csharp, javascript, typescript'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Map language to SDK if applicable $sdk = $this->mapLanguageToSdk($language); // Search for code-related chunks $allChunks = $index->searchChunks($query, $sdk); $codeExamples = []; foreach ($allChunks as $allChunk) { // Get the full content for this chunk $chunkContent = $this->getChunkContent($allChunk['chunk_id'], $index); $chunkWithContent = $allChunk; $chunkWithContent['content'] = $chunkContent; $examples = $this->extractCodeFromChunk($chunkWithContent, $language); foreach ($examples as $example) { $example['chunk'] = $allChunk; $codeExamples[] = $example; } } $totalExamples = count($codeExamples); if (0 === $totalExamples) { return "## Code Examples No code examples found for: **{$query}**" . (null !== $language ? sprintf(' (language: %s)', $language) : '') . "\n\nTry:\n- Searching for specific method or class names\n- Using OpenFGA terminology (e.g., 'check', 'expand', 'tuples')\n- Removing language filter for broader results"; } // Apply pagination $paginatedExamples = array_slice($codeExamples, $offset, $limit); $currentPage = (int) floor($offset / $limit) + 1; $totalPages = (int) ceil($totalExamples / $limit); // Build markdown response $markdown = "## Code Examples\n\n"; $markdown .= "**Search:** `{$query}`\n"; if (null !== $language) { $markdown .= sprintf('**Language:** %s%s', $language, PHP_EOL); } $markdown .= '**Results:** Showing ' . ($offset + 1) . '-' . min($offset + $limit, $totalExamples) . " of {$totalExamples} examples\n\n"; $markdown .= "---\n\n"; foreach ($paginatedExamples as $exampleIndex => $example) { $exampleNumber = $offset + $exampleIndex + 1; $markdown .= $this->formatCodeExample($example, $exampleNumber, $include_context); } // Add pagination info if (1 < $totalPages) { $markdown .= "\n---\n\n### Pagination\n\n"; if (1 < $currentPage) { $prevOffset = max(0, $offset - $limit); $markdown .= sprintf('- **Previous page:** Use offset=%d%s', $prevOffset, PHP_EOL); } if ($currentPage < $totalPages) { $nextOffset = $offset + $limit; $markdown .= sprintf('- **Next page:** Use offset=%d%s', $nextOffset, PHP_EOL); } } return $markdown; } /** * Advanced documentation search with filtering and pagination. * * @param string $query Search query to find in documentation * @param string|null $sdk Filter by specific SDK (php, go, python, java, dotnet, js, laravel) * @param string $search_type Type of search: content (default), class, method, or section * @param int $limit Maximum number of results to return (default: 10) * @param int $offset Pagination offset for results (default: 0) * * @throws RuntimeException If documentation index initialization fails * * @return string Markdown-formatted search results with pagination metadata */ #[McpTool(name: 'search_documentation')] public function searchDocumentation( string $query, ?string $sdk = null, string $search_type = 'content', int $limit = 10, int $offset = 0, ): string { if ('' === trim($query)) { return '❌ Search query cannot be empty'; } if (1 > $limit || 50 < $limit) { return '❌ Limit must be between 1 and 50'; } if (0 > $offset) { return '❌ Offset cannot be negative'; } $validSearchTypes = ['content', 'class', 'method', 'section']; if (! in_array($search_type, $validSearchTypes, true)) { return '❌ Invalid search_type. Must be one of: ' . implode(', ', $validSearchTypes); } $validSdks = ['php', 'go', 'python', 'java', 'dotnet', 'js', 'laravel', null]; if (! in_array($sdk, $validSdks, true)) { return '❌ Invalid SDK. Must be one of: php, go, python, java, dotnet, js, laravel'; } $index = DocumentationIndexSingleton::getInstance(); if (! $index->isInitialized()) { $index->initialize(); } // Get all results first for total count $allResults = $this->performSearch($index, $query, $sdk, $search_type); $totalResults = count($allResults); if (0 === $totalResults) { return "## Documentation Search Results No results found for query: **{$query}**" . (null !== $sdk ? sprintf(' (filtered by SDK: %s)', $sdk) : '') . "\n\nTry:\n- Using different keywords\n- Checking spelling\n- Using broader search terms"; } // Apply pagination $paginatedResults = array_slice($allResults, $offset, $limit); $currentPage = (int) floor($offset / $limit) + 1; $totalPages = (int) ceil($totalResults / $limit); // Build markdown response $markdown = "## Documentation Search Results\n\n"; $markdown .= "**Query:** `{$query}`\n"; if (null !== $sdk) { $markdown .= sprintf('**SDK Filter:** %s%s', $sdk, PHP_EOL); } $markdown .= sprintf('**Search Type:** %s%s', $search_type, PHP_EOL); $markdown .= '**Results:** Showing ' . ($offset + 1) . '-' . min($offset + $limit, $totalResults) . " of {$totalResults} total results\n"; $markdown .= "**Page:** {$currentPage} of {$totalPages}\n\n"; $markdown .= "---\n\n"; foreach ($paginatedResults as $resultIndex => $result) { $resultNumber = $offset + (int) $resultIndex + 1; $markdown .= $this->formatSearchResult($result, $resultNumber); } // Add pagination info if (1 < $totalPages) { $markdown .= "\n---\n\n### Pagination\n\n"; if (1 < $currentPage) { $prevOffset = max(0, $offset - $limit); $markdown .= sprintf('- **Previous page:** Use offset=%d%s', $prevOffset, PHP_EOL); } if ($currentPage < $totalPages) { $nextOffset = $offset + $limit; $markdown .= sprintf('- **Next page:** Use offset=%d%s', $nextOffset, PHP_EOL); } } return $markdown; } /** * Calculate similarity between two pieces of content. * * @param string $content1 * @param string $content2 * @return float Similarity score between 0 and 1 */ private function calculateSimilarity(string $content1, string $content2): float { if ('' === $content1 || '' === $content2) { return 0.0; } // Extract terms from both contents $terms1 = $this->extractKeyTerms($content1); $terms2 = $this->extractKeyTerms($content2); if ([] === $terms1 || [] === $terms2) { return 0.0; } // Calculate Jaccard similarity $intersection = count(array_intersect($terms1, $terms2)); $union = count(array_unique(array_merge($terms1, $terms2))); // Union will always be at least 1 since we checked both term arrays are non-empty $jaccard = (float) ($intersection / $union); // Also check for exact phrase matches for higher similarity $phrases = [ 'authorization model', 'permission check', 'tuple creation', 'relationship tuples', 'access control', 'openfga', ]; $phraseBonus = 0.0; foreach ($phrases as $phrase) { if (false !== stripos($content1, $phrase) && false !== stripos($content2, $phrase)) { $phraseBonus += 0.1; } } // Combine scores (cap at 1.0) return min(1.0, $jaccard + $phraseBonus); } /** * Extract code examples from a chunk. * * @param array<string, mixed> $chunk * @param string|null $language * @return array<array<string, mixed>> */ private function extractCodeFromChunk(array $chunk, ?string $language): array { $content = isset($chunk['content']) && is_scalar($chunk['content']) ? (string) $chunk['content'] : ''; $examples = []; // Match code blocks with optional language specification $pattern = '/```(\w+)?\n(.*?)\n```/s'; $result = preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); if (false !== $result && 0 < $result) { foreach ($matches as $match) { // When preg_match_all succeeds with PREG_SET_ORDER, capture groups exist // Optional groups will be empty strings if they don't match /** @var array{0: string, 1: string, 2: string} $match */ $codeLang = $match[1]; $codeContent = $match[2]; // Filter by language if specified if (null !== $language) { $langMatch = false; switch ($language) { case 'php': $langMatch = 'php' === $codeLang || false !== stripos($codeContent, '<?php'); break; case 'go': $langMatch = 'go' === $codeLang || false !== stripos($codeContent, 'func '); break; case 'python': $langMatch = 'python' === $codeLang || 'py' === $codeLang || false !== stripos($codeContent, 'def '); break; case 'java': $langMatch = 'java' === $codeLang || false !== stripos($codeContent, 'public class'); break; case 'csharp': $langMatch = 'csharp' === $codeLang || 'cs' === $codeLang || false !== stripos($codeContent, 'using '); break; case 'javascript': case 'typescript': $langMatch = in_array($codeLang, ['javascript', 'js', 'typescript', 'ts'], true); break; } if (! $langMatch) { continue; } } $examples[] = [ 'language' => '' !== $codeLang ? $codeLang : 'unknown', 'code' => $codeContent, 'context' => $this->extractContext($content, $match[0]), ]; } } return $examples; } /** * Extract context around code. * * @param string $content * @param string $codeBlock */ private function extractContext(string $content, string $codeBlock): string { $position = strpos($content, $codeBlock); if (false === $position) { return ''; } // Get text before the code block (up to 200 chars) $beforeStart = max(0, $position - 200); $beforeText = substr($content, $beforeStart, $position - $beforeStart); // Get text after the code block (up to 200 chars) $afterStart = $position + strlen($codeBlock); $afterText = substr($content, $afterStart, 200); // Clean up and combine $beforeText = trim(preg_replace('/\s+/', ' ', $beforeText) ?? ''); $afterText = trim(preg_replace('/\s+/', ' ', $afterText) ?? ''); $context = ''; if ('' !== $beforeText) { $context .= '...' . $beforeText; } $context .= ' [CODE] '; if ('' !== $afterText) { $context .= $afterText . '...'; } return trim($context); } /** * Extract key terms from content for similarity matching. * * @param string $content * @return array<string> */ private function extractKeyTerms(string $content): array { // Remove code blocks and special characters $cleanContent = preg_replace('/```[\s\S]*?```/', '', $content); $cleanContent ??= ''; $cleanContent = preg_replace('/[^a-zA-Z0-9\s]/', ' ', $cleanContent); $cleanContent ??= ''; // Extract words $words = preg_split('/\s+/', strtolower($cleanContent)); $words = false !== $words ? $words : []; // Filter out common words and short words $stopWords = ['the', 'is', 'at', 'which', 'on', 'and', 'a', 'an', 'as', 'are', 'was', 'were', 'been', 'be', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'what', 'which', 'who', 'when', 'where', 'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'in', 'of', 'to', 'for', 'with', 'from', 'up', 'out', 'if', 'about', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between', 'under', 'again', 'further', 'then', 'once']; $termCounts = []; foreach ($words as $word) { if (2 < strlen($word) && ! in_array($word, $stopWords, true)) { if (! isset($termCounts[$word])) { $termCounts[$word] = 0; } ++$termCounts[$word]; } } // Sort by frequency and take top terms arsort($termCounts); $keyTerms = array_keys(array_slice($termCounts, 0, 10)); // Add OpenFGA-specific terms if present $openfgaTerms = ['openfga', 'authorization', 'permission', 'tuple', 'relation', 'check', 'expand', 'store', 'model', 'user', 'object']; foreach ($openfgaTerms as $openfgaTerm) { if (false !== stripos($content, $openfgaTerm) && ! in_array($openfgaTerm, $keyTerms, true)) { $keyTerms[] = $openfgaTerm; } } return array_slice($keyTerms, 0, 15); } /** * Format a code example as markdown. * * @param array<string, mixed> $example * @param int $number * @param bool $includeContext */ private function formatCodeExample(array $example, int $number, bool $includeContext): string { $markdown = "### Example {$number}\n\n"; $chunk = isset($example['chunk']) && is_array($example['chunk']) ? $example['chunk'] : []; // Add metadata if (isset($chunk['sdk']) && '' !== $chunk['sdk']) { $chunkSdk = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : ''; $markdown .= "**SDK:** `{$chunkSdk}` \n"; } // Access class and method from metadata $metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $chunkClass = is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; $markdown .= sprintf('**Class:** `%s`', $chunkClass); if (isset($metadata['method']) && '' !== $metadata['method']) { $chunkMethod = is_scalar($metadata['method']) ? (string) $metadata['method'] : ''; $markdown .= sprintf(' **Method:** `%s`', $chunkMethod); } $markdown .= " \n"; } if (isset($example['language']) && '' !== $example['language'] && 'unknown' !== $example['language']) { $exampleLang = is_scalar($example['language']) ? (string) $example['language'] : ''; $markdown .= "**Language:** `{$exampleLang}` \n"; } $markdown .= "\n"; // Add context if requested if ($includeContext && isset($example['context']) && '' !== $example['context']) { $context = is_scalar($example['context']) ? (string) $example['context'] : ''; $markdown .= "**Context:**\n> " . str_replace('[CODE]', '*(see code below)*', $context) . "\n\n"; } // Add code $lang = isset($example['language']) && is_scalar($example['language']) ? (string) $example['language'] : ''; $code = isset($example['code']) && is_scalar($example['code']) ? (string) $example['code'] : ''; $markdown .= "```{$lang}\n{$code}\n```\n"; return $markdown . "\n---\n\n"; } /** * Format a search result as markdown. * * @param array<string, mixed> $result * @param int $number */ private function formatSearchResult(array $result, int $number): string { $markdown = sprintf('### %d. ', $number); // Build title based on available metadata $title = ''; $metadata = isset($result['metadata']) && is_array($result['metadata']) ? $result['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $title .= is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; if (isset($metadata['method']) && '' !== $metadata['method']) { $title .= '::' . (is_scalar($metadata['method']) ? (string) $metadata['method'] : ''); } } elseif (isset($metadata['section']) && '' !== $metadata['section']) { $title .= is_scalar($metadata['section']) ? (string) $metadata['section'] : ''; } else { $title .= 'Documentation Chunk'; } $markdown .= $title . "\n\n"; // Add metadata if (isset($result['sdk']) && '' !== $result['sdk']) { $sdkName = is_scalar($result['sdk']) ? (string) $result['sdk'] : ''; $markdown .= "**SDK:** `{$sdkName}` \n"; } if (isset($result['source']) && '' !== $result['source']) { $sourceName = is_scalar($result['source']) ? (string) $result['source'] : ''; $markdown .= "**Source:** `{$sourceName}` \n"; } if (isset($result['score']) && 0.0 !== $result['score']) { $scoreValue = is_numeric($result['score']) ? (float) $result['score'] : 0.0; $markdown .= '**Relevance:** ' . (string) round($scoreValue * 100.0) . "% \n"; } $markdown .= "\n"; // Add preview if (isset($result['preview']) && '' !== $result['preview']) { $preview = is_scalar($result['preview']) ? (string) $result['preview'] : ''; // Limit preview length if (500 < strlen($preview)) { $preview = substr($preview, 0, 497) . '...'; } $markdown .= "**Preview:**\n```\n{$preview}\n```\n"; } // Add navigation if (isset($result['chunk_id']) && '' !== $result['chunk_id']) { $sdk = isset($result['sdk']) && is_scalar($result['sdk']) ? (string) $result['sdk'] : 'unknown'; $id = isset($result['chunk_id']) && is_scalar($result['chunk_id']) ? (string) $result['chunk_id'] : 'unknown'; $markdown .= "\n**Reference:** `{$sdk}::{$id}`\n"; } return $markdown . "\n---\n\n"; } /** * Format a similar documentation result as markdown. * * @param array<string, mixed> $chunk * @param int $number */ private function formatSimilarResult(array $chunk, int $number): string { $markdown = sprintf('### %d. ', $number); // Build title $title = ''; $metadata = isset($chunk['metadata']) && is_array($chunk['metadata']) ? $chunk['metadata'] : []; if (isset($metadata['class']) && '' !== $metadata['class']) { $title .= is_scalar($metadata['class']) ? (string) $metadata['class'] : ''; if (isset($metadata['method']) && '' !== $metadata['method']) { $title .= '::' . (is_scalar($metadata['method']) ? (string) $metadata['method'] : ''); } } elseif (isset($metadata['section']) && '' !== $metadata['section']) { $title .= is_scalar($metadata['section']) ? (string) $metadata['section'] : ''; } else { $title .= 'Related Documentation'; } $markdown .= $title . "\n\n"; // Add metadata if (isset($chunk['sdk']) && '' !== $chunk['sdk']) { $chunkSdkValue = is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : ''; $markdown .= "**SDK:** `{$chunkSdkValue}` \n"; } if (isset($chunk['similarity']) && 0.0 !== $chunk['similarity']) { $simScore = is_numeric($chunk['similarity']) ? (float) $chunk['similarity'] : 0.0; $markdown .= '**Similarity Score:** ' . (string) round($simScore * 100.0) . "% \n"; } if (isset($chunk['source']) && '' !== $chunk['source']) { $sourceValue = is_scalar($chunk['source']) ? (string) $chunk['source'] : ''; $markdown .= "**Source:** `{$sourceValue}` \n"; } $markdown .= "\n"; // Add content preview if (isset($chunk['content']) && '' !== $chunk['content']) { $preview = is_scalar($chunk['content']) ? (string) $chunk['content'] : ''; // Limit preview length if (800 < strlen($preview)) { $preview = substr($preview, 0, 797) . '...'; } $markdown .= "**Content:**\n\n" . $preview . "\n"; } // Add reference if (isset($chunk['chunk_id']) && '' !== $chunk['chunk_id']) { $sdk = isset($chunk['sdk']) && is_scalar($chunk['sdk']) ? (string) $chunk['sdk'] : 'unknown'; $id = isset($chunk['chunk_id']) && is_scalar($chunk['chunk_id']) ? (string) $chunk['chunk_id'] : 'unknown'; $markdown .= "\n**Reference:** `{$sdk}::{$id}`\n"; } return $markdown . "\n---\n\n"; } /** * Get the full content of a chunk by its ID. * * @param string $chunkId * @param DocumentationIndex $index */ private function getChunkContent(string $chunkId, DocumentationIndex $index): string { // For now, we'll use the chunk ID to get content // In a real implementation, we'd fetch this from the index $chunk = $index->getChunkById($chunkId); if (null === $chunk) { return ''; } return $chunk['content'] ?? ''; } /** * Map programming language to SDK. * * @param string|null $language */ private function mapLanguageToSdk(?string $language): ?string { if (null === $language) { return null; } $mapping = [ 'php' => 'php', 'go' => 'go', 'python' => 'python', 'java' => 'java', 'csharp' => 'dotnet', 'javascript' => 'js', 'typescript' => 'js', ]; return $mapping[$language] ?? null; } /** * Perform search based on search type. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * @param string $searchType * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function performSearch(DocumentationIndex $index, string $query, ?string $sdk, string $searchType): array { return match ($searchType) { 'class' => $this->searchForClasses($index, $query, $sdk), 'method' => $this->searchForMethods($index, $query, $sdk), 'section' => $this->searchForSections($index, $query, $sdk), default => $index->searchChunks($query, $sdk), }; } /** * Search specifically for classes. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForClasses(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $classResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['class']) && '' !== $metadata['class'] && is_scalar($metadata['class']) && false !== stripos((string) $metadata['class'], $query)) { $classResults[] = $allChunk; } } return $classResults; } /** * Search specifically for methods. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForMethods(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $methodResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['method']) && '' !== $metadata['method'] && is_scalar($metadata['method']) && false !== stripos((string) $metadata['method'], $query)) { $methodResults[] = $allChunk; } } return $methodResults; } /** * Search specifically for sections. * * @param DocumentationIndex $index * @param string $query * @param string|null $sdk * * @throws RuntimeException If search fails * * @return array<array<string, mixed>> */ private function searchForSections(DocumentationIndex $index, string $query, ?string $sdk): array { $allChunks = $index->searchChunks($query, $sdk); $sectionResults = []; foreach ($allChunks as $allChunk) { $metadata = $allChunk['metadata']; if (isset($metadata['section']) && '' !== $metadata['section'] && is_scalar($metadata['section']) && false !== stripos((string) $metadata['section'], $query)) { $sectionResults[] = $allChunk; } } return $sectionResults; } }�jNuj jj#j4j=jJjWjdjqj~j�j�j�j�j�j�j�j�j�jj jj'j4jAjNj[jdjqj~j�j�j�j�j�j�j�j�j�jjjj+j8jEjRj_jljyj�j�j�j�j�j�j�j�j�j�jjj"j/j<jMjVjcjpj}j�j�j�j�j�j�j�j�j�j�j jj&j3j@jQjZjgjtj�j�j�j�j�j�j�j�j�j�jjjj*j7jDjQj^jkjxj�j�j�j�j�j�j�j�j�j�j j j! j. j; jH jY jb jo j| j� j� j� j� j� j� j� j� j� j� j j j% j6 j? jL jY jf js j� j� j� j� j� j� j� j� j� j� j j j j) j6 jC jP j] jj jw j� j� j� j� j� j� j� j� j� j� j j j j- j> jG jT ja jr j{ j� j� j� j� j� j� j� j� j� j� j j j$ j1 j> jO jX je jr j j� j� j� j� j� j� j� j� j� jjjj(e]�(j�je�����&src/Tools/DocumentationTools.php-False�� 4c1690a2af21a98442f4ef723e97f44b�]�(}�(�name��OpenFGA\MCP\Tools��kind�K�range�}�(�start�}�(�line�K� character�Ku�end�}�(jKKjLKuu�selectionRange�}�(jI}�(jKKjLK ujM}�(jKKjLKuu�location�}�(�uri��Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php��range�jH� absolutePath��K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�� relativePath�� src/Tools/DocumentationTools.php�u�children�]��parent�Nu}�(jD�DocumentationTools�jFKjG}�(jI}�(jKKjLKujM}�(jKMXjLKuujO}�(jI}�(jKKjLKujM}�(jKKjLK'uu�children�]�(}�(jD�$client��detail�� (promoted)�jFKjG}�(jI}�(jKKjLKujM}�(jKKjLK'uujO}�(jI}�(jKKjLK ujM}�(jKKjLK'uuj^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjmjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� __construct�jFK jG}�(jI}�(jKKjLKujM}�(jKKjLKuujO}�(jI}�(jKKjLKujM}�(jKKjLKuujg]�}�(jD�$client�jFK jG}�(jI}�(jKKjLKujM}�(jKKjLK'uujO}�(jI}�(jKKjLK ujM}�(jKKjLK'uuj^jwjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uaj^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjyjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�findSimilarDocumentation�jFKjG}�(jI}�(jKKjLKujM}�(jKK�jLKuujO}�(jI}�(jKK'jLKujM}�(jKK'jLK,uujg]�(}�(jD�$content�jFK jG}�(jI}�(jKK(jLKujM}�(jKK(jLKuujO}�(jI}�(jKK(jLKujM}�(jKK(jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKK)jLKujM}�(jKK)jLKuujO}�(jI}�(jKK)jLKujM}�(jKK)jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$similarity_threshold�jFK jG}�(jI}�(jKK*jLKujM}�(jKK*jLK)uujO}�(jI}�(jKK*jLKujM}�(jKK*jLK#uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$limit�jFK jG}�(jI}�(jKK+jLKujM}�(jKK+jLKuujO}�(jI}�(jKK+jLK ujM}�(jKK+jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $validSdks�jFK jG}�(jI}�(jKK9jLKujM}�(jKK9jLKuujO}�(jI}�(jKK9jLKujM}�(jKK9jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$index�jFK jG}�(jI}�(jKK?jLKujM}�(jKK?jLKuujO}�(jI}�(jKK?jLKujM}�(jKK?jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $keyTerms�jFK jG}�(jI}�(jKKFjLKujM}�(jKKFjLKuujO}�(jI}�(jKKFjLKujM}�(jKKFjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$similarChunks�jFK jG}�(jI}�(jKKNjLKujM}�(jKKNjLKuujO}�(jI}�(jKKNjLKujM}�(jKKNjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$keyTerm�jFK jG}�(jI}�(jKKPjLKujM}�(jKKPjLK&uujO}�(jI}�(jKKPjLKujM}�(jKKPjLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunks�jFK jG}�(jI}�(jKKQjLK ujM}�(jKKQjLKuujO}�(jI}�(jKKQjLK ujM}�(jKKQjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunk�jFK jG}�(jI}�(jKKSjLK ujM}�(jKKSjLK&uujO}�(jI}�(jKKSjLK ujM}�(jKKSjLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkContent�jFK jG}�(jI}�(jKKVjLKujM}�(jKKVjLKuujO}�(jI}�(jKKVjLKujM}�(jKKVjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $similarity�jFK jG}�(jI}�(jKKWjLKujM}�(jKKWjLKuujO}�(jI}�(jKKWjLKujM}�(jKKWjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj*jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunkWithSimilarity�jFK jG}�(jI}�(jKK[jLKujM}�(jKK[jLK(uujO}�(jI}�(jKK[jLKujM}�(jKK[jLK(uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj6jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunkWithSimilarity�jFK jG}�(jI}�(jKK\jLKujM}�(jKK\jLK(uujO}�(jI}�(jKK\jLKujM}�(jKK\jLK(uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjBjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunkWithSimilarity�jFK jG}�(jI}�(jKK]jLKujM}�(jKK]jLK(uujO}�(jI}�(jKK]jLKujM}�(jKK]jLK(uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjNjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkKey�jFK jG}�(jI}�(jKK_jLKujM}�(jKK_jLKuujO}�(jI}�(jKK_jLKujM}�(jKK_jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjZjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$similarChunks�jFK jG}�(jI}�(jKKbjLKujM}�(jKKbjLK&uujO}�(jI}�(jKKbjLKujM}�(jKKbjLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjfjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkKey�jFK jG}�(jI}�(jKKbjLK'ujM}�(jKKbjLK0uujO}�(jI}�(jKKbjLK'ujM}�(jKKbjLK0uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjrjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $existingSim�jFK jG}�(jI}�(jKKdjLKujM}�(jKKdjLK$uujO}�(jI}�(jKKdjLKujM}�(jKKdjLK$uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj~jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$similarChunks�jFK jG}�(jI}�(jKKgjLKujM}�(jKKgjLK*uujO}�(jI}�(jKKgjLKujM}�(jKKgjLK*uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkKey�jFK jG}�(jI}�(jKKgjLK+ujM}�(jKKgjLK4uujO}�(jI}�(jKKgjLK+ujM}�(jKKgjLK4uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�Closure�jFK jG}�(jI}�(jKKojLKujM}�(jKKujLK uujO}�(jI}�(jKKojLKujM}�(jKKujLK uujg]�(}�(jD�$a�jFK jG}�(jI}�(jKKojLK/ujM}�(jKKojLK7uujO}�(jI}�(jKKojLK5ujM}�(jKKojLK7uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$b�jFK jG}�(jI}�(jKKojLK9ujM}�(jKKojLKAuujO}�(jI}�(jKKojLK?ujM}�(jKKojLKAuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $aSimilarity�jFK jG}�(jI}�(jKKqjLK ujM}�(jKKqjLKuujO}�(jI}�(jKKqjLK ujM}�(jKKqjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $bSimilarity�jFK jG}�(jI}�(jKKrjLK ujM}�(jKKrjLKuujO}�(jI}�(jKKrjLK ujM}�(jKKrjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�$similarChunks�jFK jG}�(jI}�(jKKxjLKujM}�(jKKxjLKuujO}�(jI}�(jKKxjLKujM}�(jKKxjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkIndex�jFK jG}�(jI}�(jKK�jLK#ujM}�(jKK�jLK.uujO}�(jI}�(jKK�jLK#ujM}�(jKK�jLK.uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunk�jFK jG}�(jI}�(jKK�jLK2ujM}�(jKK�jLK8uujO}�(jI}�(jKK�jLK2ujM}�(jKK�jLK8uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�searchCodeExamples�jFKjG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLK&uujg]�(}�(jD�$query�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $language�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLK uujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj&jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$include_context�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLK$uujO}�(jI}�(jKK�jLK ujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj2jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$limit�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLK ujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj>jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$offset�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLK ujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjJjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$validLanguages�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjVjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$index�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjbjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLK uujO}�(jI}�(jKK�jLKujM}�(jKK�jLK uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjnjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunks�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjzjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $codeExamples�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunk�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLK(uujO}�(jI}�(jKK�jLKujM}�(jKK�jLK(uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $examples�jFK jG}�(jI}�(jKK�jLK ujM}�(jKK�jLKuujO}�(jI}�(jKK�jLK ujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$example�jFK jG}�(jI}�(jKK�jLK"ujM}�(jKK�jLK*uujO}�(jI}�(jKK�jLK"ujM}�(jKK�jLK*uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$example�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $codeExamples�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$totalExamples�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$paginatedExamples�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $currentPage�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $totalPages�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php��jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $exampleIndex�jFK jG}�(jI}�(jKK�jLK'ujM}�(jKK�jLK4uujO}�(jI}�(jKK�jLK'ujM}�(jKK�jLK4uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$example�jFK jG}�(jI}�(jKK�jLK8ujM}�(jKK�jLK@uujO}�(jI}�(jKK�jLK8ujM}�(jKK�jLK@uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$exampleNumber�jFK jG}�(jI}�(jKK�jLK ujM}�(jKK�jLKuujO}�(jI}�(jKK�jLK ujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj"jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $prevOffset�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj.jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $nextOffset�jFK jG}�(jI}�(jKK�jLKujM}�(jKK�jLKuujO}�(jI}�(jKK�jLKujM}�(jKK�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj:jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�searchDocumentation�jFKjG}�(jI}�(jKK�jLKujM}�(jKMYjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLK'uujg]�(}�(jD�$query�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjRjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj^jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $search_type�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLK'uujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$limit�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLK ujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjvjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$offset�jFK jG}�(jI}�(jKM jLKujM}�(jKM jLKuujO}�(jI}�(jKM jLK ujM}�(jKM jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$validSearchTypes�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $validSdks�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$index�jFK jG}�(jI}�(jKM#jLKujM}�(jKM#jLKuujO}�(jI}�(jKM#jLKujM}�(jKM#jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allResults�jFK jG}�(jI}�(jKM*jLKujM}�(jKM*jLKuujO}�(jI}�(jKM*jLKujM}�(jKM*jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $totalResults�jFK jG}�(jI}�(jKM+jLKujM}�(jKM+jLKuujO}�(jI}�(jKM+jLKujM}�(jKM+jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$paginatedResults�jFK jG}�(jI}�(jKM4jLKujM}�(jKM4jLKuujO}�(jI}�(jKM4jLKujM}�(jKM4jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $currentPage�jFK jG}�(jI}�(jKM5jLKujM}�(jKM5jLKuujO}�(jI}�(jKM5jLKujM}�(jKM5jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $totalPages�jFK jG}�(jI}�(jKM6jLKujM}�(jKM6jLKuujO}�(jI}�(jKM6jLKujM}�(jKM6jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKM9jLKujM}�(jKM9jLKuujO}�(jI}�(jKM9jLKujM}�(jKM9jLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $resultIndex�jFK jG}�(jI}�(jKMDjLK&ujM}�(jKMDjLK2uujO}�(jI}�(jKMDjLK&ujM}�(jKMDjLK2uuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$result�jFK jG}�(jI}�(jKMDjLK6ujM}�(jKMDjLK=uujO}�(jI}�(jKMDjLK6ujM}�(jKMDjLK=uuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $resultNumber�jFK jG}�(jI}�(jKMEjLK ujM}�(jKMEjLKuujO}�(jI}�(jKMEjLK ujM}�(jKMEjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $prevOffset�jFK jG}�(jI}�(jKMNjLKujM}�(jKMNjLKuujO}�(jI}�(jKMNjLKujM}�(jKMNjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $nextOffset�jFK jG}�(jI}�(jKMSjLKujM}�(jKMSjLKuujO}�(jI}�(jKMSjLKujM}�(jKMSjLKuuj^jGjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj*jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjIjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�calculateSimilarity�jFKjG}�(jI}�(jKM[jLKujM}�(jKM�jLKuujO}�(jI}�(jKMbjLKujM}�(jKMbjLK(uujg]�(}�(jD� $content1�jFK jG}�(jI}�(jKMbjLK)ujM}�(jKMbjLK9uujO}�(jI}�(jKMbjLK0ujM}�(jKMbjLK9uuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjBjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $content2�jFK jG}�(jI}�(jKMbjLK;ujM}�(jKMbjLKKuujO}�(jI}�(jKMbjLKBujM}�(jKMbjLKKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjNjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$terms1�jFK jG}�(jI}�(jKMijLKujM}�(jKMijLKuujO}�(jI}�(jKMijLKujM}�(jKMijLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjZjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$terms2�jFK jG}�(jI}�(jKMjjLKujM}�(jKMjjLKuujO}�(jI}�(jKMjjLKujM}�(jKMjjLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjfjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $intersection�jFK jG}�(jI}�(jKMqjLKujM}�(jKMqjLKuujO}�(jI}�(jKMqjLKujM}�(jKMqjLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjrjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$union�jFK jG}�(jI}�(jKMrjLKujM}�(jKMrjLKuujO}�(jI}�(jKMrjLKujM}�(jKMrjLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj~jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$jaccard�jFK jG}�(jI}�(jKMxjLKujM}�(jKMxjLKuujO}�(jI}�(jKMxjLKujM}�(jKMxjLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$phrases�jFK jG}�(jI}�(jKM{jLKujM}�(jKM{jLKuujO}�(jI}�(jKM{jLKujM}�(jKM{jLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $phraseBonus�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$phrase�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK$uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK$uuj^j7jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj9jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�extractCodeFromChunk�jFKjG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLK)uujg]�(}�(jD�$chunk�jFK jG}�(jI}�(jKM�jLK*ujM}�(jKM�jLK6uujO}�(jI}�(jKM�jLK0ujM}�(jKM�jLK6uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $language�jFK jG}�(jI}�(jKM�jLK8ujM}�(jKM�jLKIuujO}�(jI}�(jKM�jLK@ujM}�(jKM�jLKIuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$content�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $examples�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$pattern�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$result�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$match�jFK jG}�(jI}�(jKM�jLK!ujM}�(jKM�jLK'uujO}�(jI}�(jKM�jLK!ujM}�(jKM�jLK'uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $codeLang�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $codeContent�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj&jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj2jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj>jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjJjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjVjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjbjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjnjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $langMatch�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLK&uujO}�(jI}�(jKM�jLKujM}�(jKM�jLK&uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjzjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $examples�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�extractContext�jFKjG}�(jI}�(jKM�jLKujM}�(jKMjLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLK#uujg]�(}�(jD�$content�jFK jG}�(jI}�(jKM�jLK$ujM}�(jKM�jLK3uujO}�(jI}�(jKM�jLK+ujM}�(jKM�jLK3uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $codeBlock�jFK jG}�(jI}�(jKM�jLK5ujM}�(jKM�jLKFuujO}�(jI}�(jKM�jLK<ujM}�(jKM�jLKFuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $position�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $beforeStart�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $beforeText�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $afterStart�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $afterText�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $beforeText�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $afterText�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$context�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�extractKeyTerms�jFKjG}�(jI}�(jKMjLKujM}�(jKM3jLKuujO}�(jI}�(jKM jLKujM}�(jKM jLK$uujg]�(}�(jD�$content�jFK jG}�(jI}�(jKM jLK%ujM}�(jKM jLK4uujO}�(jI}�(jKM jLK,ujM}�(jKM jLK4uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj"jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $cleanContent�jFK jG}�(jI}�(jKM jLKujM}�(jKM jLKuujO}�(jI}�(jKM jLKujM}�(jKM jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj.jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $cleanContent�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj:jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $cleanContent�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjFjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $cleanContent�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjRjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$words�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj^jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$words�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $stopWords�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjvjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $keyTerms�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $termCounts�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$word�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLK uujO}�(jI}�(jKMjLKujM}�(jKMjLK uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $termCounts�jFK jG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKMjLKujM}�(jKMjLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$word�jFK jG}�(jI}�(jKMjLK ujM}�(jKMjLK%uujO}�(jI}�(jKMjLK ujM}�(jKMjLK%uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $keyTerms�jFK jG}�(jI}�(jKM'jLKujM}�(jKM'jLKuujO}�(jI}�(jKM'jLKujM}�(jKM'jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $openfgaTerms�jFK jG}�(jI}�(jKM*jLKujM}�(jKM*jLKuujO}�(jI}�(jKM*jLKujM}�(jKM*jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $openfgaTerm�jFK jG}�(jI}�(jKM,jLK"ujM}�(jKM,jLK.uujO}�(jI}�(jKM,jLK"ujM}�(jKM,jLK.uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $keyTerms�jFK jG}�(jI}�(jKM.jLKujM}�(jKM.jLKuujO}�(jI}�(jKM.jLKujM}�(jKM.jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�formatCodeExample�jFKjG}�(jI}�(jKM5jLKujM}�(jKMfjLKuujO}�(jI}�(jKM<jLKujM}�(jKM<jLK&uujg]�(}�(jD�$example�jFK jG}�(jI}�(jKM<jLK'ujM}�(jKM<jLK5uujO}�(jI}�(jKM<jLK-ujM}�(jKM<jLK5uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$number�jFK jG}�(jI}�(jKM<jLK7ujM}�(jKM<jLKBuujO}�(jI}�(jKM<jLK;ujM}�(jKM<jLKBuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$includeContext�jFK jG}�(jI}�(jKM<jLKDujM}�(jKM<jLKXuujO}�(jI}�(jKM<jLKIujM}�(jKM<jLKXuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKM>jLKujM}�(jKM>jLKuujO}�(jI}�(jKM>jLKujM}�(jKM>jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunk�jFK jG}�(jI}�(jKM@jLKujM}�(jKM@jLKuujO}�(jI}�(jKM@jLKujM}�(jKM@jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj*jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkSdk�jFK jG}�(jI}�(jKMDjLK ujM}�(jKMDjLKuujO}�(jI}�(jKMDjLK ujM}�(jKMDjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj6jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkClass�jFK jG}�(jI}�(jKMIjLK ujM}�(jKMIjLKuujO}�(jI}�(jKMIjLK ujM}�(jKMIjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjBjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $chunkMethod�jFK jG}�(jI}�(jKMMjLKujM}�(jKMMjLKuujO}�(jI}�(jKMMjLKujM}�(jKMMjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjNjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $exampleLang�jFK jG}�(jI}�(jKMTjLK ujM}�(jKMTjLKuujO}�(jI}�(jKMTjLK ujM}�(jKMTjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjZjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$context�jFK jG}�(jI}�(jKM\jLK ujM}�(jKM\jLKuujO}�(jI}�(jKM\jLK ujM}�(jKM\jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjfjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$lang�jFK jG}�(jI}�(jKMajLKujM}�(jKMajLK uujO}�(jI}�(jKMajLKujM}�(jKMajLK uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjrjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$code�jFK jG}�(jI}�(jKMbjLKujM}�(jKMbjLK uujO}�(jI}�(jKMbjLKujM}�(jKMbjLK uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj~jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�formatSearchResult�jFKjG}�(jI}�(jKMhjLKujM}�(jKM�jLKuujO}�(jI}�(jKMnjLKujM}�(jKMnjLK'uujg]�(}�(jD�$result�jFK jG}�(jI}�(jKMnjLK(ujM}�(jKMnjLK5uujO}�(jI}�(jKMnjLK.ujM}�(jKMnjLK5uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$number�jFK jG}�(jI}�(jKMnjLK7ujM}�(jKMnjLKBuujO}�(jI}�(jKMnjLK;ujM}�(jKMnjLKBuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKMpjLKujM}�(jKMpjLKuujO}�(jI}�(jKMpjLKujM}�(jKMpjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$title�jFK jG}�(jI}�(jKMsjLKujM}�(jKMsjLKuujO}�(jI}�(jKMsjLKujM}�(jKMsjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdkName�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $sourceName�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $scoreValue�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$preview�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$preview�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$id�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�formatSimilarResult�jFKjG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLK(uujg]�(}�(jD�$chunk�jFK jG}�(jI}�(jKM�jLK)ujM}�(jKM�jLK5uujO}�(jI}�(jKM�jLK/ujM}�(jKM�jLK5uuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj&jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$number�jFK jG}�(jI}�(jKM�jLK7ujM}�(jKM�jLKBuujO}�(jI}�(jKM�jLK;ujM}�(jKM�jLKBuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj2jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $markdown�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj>jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$title�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjJjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$chunkSdkValue�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjVjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $simScore�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjbjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $sourceValue�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjnjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$preview�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjzjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$preview�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$id�jFK jG}�(jI}�(jKM�jLK ujM}�(jKM�jLKuujO}�(jI}�(jKM�jLK ujM}�(jKM�jLKuuj^jjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�mapLanguageToSdk�jFKjG}�(jI}�(jKM�jLKujM}�(jKMjLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLK%uujg]�(}�(jD� $language�jFK jG}�(jI}�(jKM�jLK&ujM}�(jKM�jLK7uujO}�(jI}�(jKM�jLK.ujM}�(jKM�jLK7uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$mapping�jFK jG}�(jI}�(jKM�jLKujM}�(jKM�jLKuujO}�(jI}�(jKM�jLKujM}�(jKM�jLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD� performSearch�jFKjG}�(jI}�(jKMjLKujM}�(jKMjLKuujO}�(jI}�(jKM jLKujM}�(jKM jLK"uujg]�(}�(jD�$index�jFK jG}�(jI}�(jKM jLK#ujM}�(jKM jLK<uujO}�(jI}�(jKM jLK6ujM}�(jKM jLK<uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$query�jFK jG}�(jI}�(jKM jLK>ujM}�(jKM jLKKuujO}�(jI}�(jKM jLKEujM}�(jKM jLKKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKM jLKMujM}�(jKM jLKYuujO}�(jI}�(jKM jLKUujM}�(jKM jLKYuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $searchType�jFK jG}�(jI}�(jKM jLK[ujM}�(jKM jLKmuujO}�(jI}�(jKM jLKbujM}�(jKM jLKmuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�searchForClasses�jFKjG}�(jI}�(jKMjLKujM}�(jKM+jLKuujO}�(jI}�(jKMjLKujM}�(jKMjLK%uujg]�(}�(jD�$index�jFK jG}�(jI}�(jKMjLK&ujM}�(jKMjLK?uujO}�(jI}�(jKMjLK9ujM}�(jKMjLK?uuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$query�jFK jG}�(jI}�(jKMjLKAujM}�(jKMjLKNuujO}�(jI}�(jKMjLKHujM}�(jKMjLKNuuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj"jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKMjLKPujM}�(jKMjLK\uujO}�(jI}�(jKMjLKXujM}�(jKMjLK\uuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj.jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunks�jFK jG}�(jI}�(jKM!jLKujM}�(jKM!jLKuujO}�(jI}�(jKM!jLKujM}�(jKM!jLKuuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj:jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $classResults�jFK jG}�(jI}�(jKM"jLKujM}�(jKM"jLKuujO}�(jI}�(jKM"jLKujM}�(jKM"jLKuuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjFjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunk�jFK jG}�(jI}�(jKM$jLKujM}�(jKM$jLK(uujO}�(jI}�(jKM$jLKujM}�(jKM$jLK(uuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjRjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $classResults�jFK jG}�(jI}�(jKM&jLKujM}�(jKM&jLKuujO}�(jI}�(jKM&jLKujM}�(jKM&jLKuuj^j jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj^jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�searchForMethods�jFKjG}�(jI}�(jKM-jLKujM}�(jKMAjLKuujO}�(jI}�(jKM5jLKujM}�(jKM5jLK%uujg]�(}�(jD�$index�jFK jG}�(jI}�(jKM5jLK&ujM}�(jKM5jLK?uujO}�(jI}�(jKM5jLK9ujM}�(jKM5jLK?uuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjvjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$query�jFK jG}�(jI}�(jKM5jLKAujM}�(jKM5jLKNuujO}�(jI}�(jKM5jLKHujM}�(jKM5jLKNuuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKM5jLKPujM}�(jKM5jLK\uujO}�(jI}�(jKM5jLKXujM}�(jKM5jLK\uuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunks�jFK jG}�(jI}�(jKM7jLKujM}�(jKM7jLKuujO}�(jI}�(jKM7jLKujM}�(jKM7jLKuuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$methodResults�jFK jG}�(jI}�(jKM8jLKujM}�(jKM8jLKuujO}�(jI}�(jKM8jLKujM}�(jKM8jLKuuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunk�jFK jG}�(jI}�(jKM:jLKujM}�(jKM:jLK(uujO}�(jI}�(jKM:jLKujM}�(jKM:jLK(uuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$methodResults�jFK jG}�(jI}�(jKM<jLKujM}�(jKM<jLKuujO}�(jI}�(jKM<jLKujM}�(jKM<jLKuuj^jkjS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjmjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uu}�(jD�searchForSections�jFKjG}�(jI}�(jKMCjLKujM}�(jKMWjLKuujO}�(jI}�(jKMKjLKujM}�(jKMKjLK&uujg]�(}�(jD�$index�jFK jG}�(jI}�(jKMKjLK'ujM}�(jKMKjLK@uujO}�(jI}�(jKMKjLK:ujM}�(jKMKjLK@uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$query�jFK jG}�(jI}�(jKMKjLKBujM}�(jKMKjLKOuujO}�(jI}�(jKMKjLKIujM}�(jKMKjLKOuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sdk�jFK jG}�(jI}�(jKMKjLKQujM}�(jKMKjLK]uujO}�(jI}�(jKMKjLKYujM}�(jKMKjLK]uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunks�jFK jG}�(jI}�(jKMMjLKujM}�(jKMMjLKuujO}�(jI}�(jKMMjLKujM}�(jKMMjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sectionResults�jFK jG}�(jI}�(jKMNjLKujM}�(jKMNjLKuujO}�(jI}�(jKMNjLKujM}�(jKMNjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD� $allChunk�jFK jG}�(jI}�(jKMPjLKujM}�(jKMPjLK(uujO}�(jI}�(jKMPjLKujM}�(jKMPjLK(uuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�u}�(jD�$sectionResults�jFK jG}�(jI}�(jKMRjLKujM}�(jKMRjLKuujO}�(jI}�(jKMRjLKujM}�(jKMRjLKuuj^j�jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjjX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj\]�uej^j_jS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWj�jX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uuejS}�(jU�Rfile:///Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jWjajX�K/Users/evan/Developer/evansims/openfga-mcp/src/Tools/DocumentationTools.php�jZj[uj^Nujijwj�j�j�j�j�j�j�j�j�j�j�jjjj(j4j@jLjXjdjpj|j�j�j�j�j�j�j�j�j�j�jjjj$j0j<jHjTj`jljxj�j�j�j�j�j�j�j�j�j�j�jjj j,j8jGjPj\jhjtj�j�j�j�j�j�j�j�j�j�j�jjjj(j7j@jLjXjdjpj|j�j�j�j�j�j�j�j�j�j�jj jj$j0j<jHjTj`jljxj�j�j�j�j�j�j�j�j�j�j�jjj j,j8jDjPj\jhjtj�j�j�j�j�j�j�j�j�j�j�jjjj(j4j@jLjXjdjpj|j�j�j�j�j�j�j�j�j�j�jj jj$j0j<jHjTj`jljxj�j�j�j�j�j�j�j�j�j�j�j jj j,j8jDjPj\jkjtj�j�j�j�j�j�j�j�j�j�j�jjje]�(jCj_e�����.src/Documentation/DocumentationIndex.php-False�� 5decbb0388fe323246fab949299c4898�]�(}�(�name��OpenFGA\MCP\Documentation��kind�K�range�}�(�start�}�(�line�K� character�Ku�end�}�(j<Kj=K$uu�selectionRange�}�(j:}�(j<Kj=K uj>}�(j<Kj=K#uujS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj9jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZ�(src/Documentation/DocumentationIndex.php�uj\]�j^Nu}�(j5�DocumentationIndex�j7Kj8}�(j:}�(j<K j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<K j=K uj>}�(j<K j=Kuu�children�]�(}�(j5�CHUNK_SIZE_LIMIT�j7Kj8}�(j:}�(j<Kj=Kuj>}�(j<Kj=K-uuj@}�(j:}�(j<Kj=Kuj>}�(j<Kj=K&uuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjUjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� DOCS_PATH�j7Kj8}�(j:}�(j<Kj=Kuj>}�(j<Kj=K<uuj@}�(j:}�(j<Kj=Kuj>}�(j<Kj=K"uuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjajX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunks�j7Kj8}�(j:}�(j<Kj=Kuj>}�(j<Kj=Kuuj@}�(j:}�(j<Kj=Kuj>}�(j<Kj=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjmjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$index�j7Kj8}�(j:}�(j<Kj=Kuj>}�(j<Kj=Kuuj@}�(j:}�(j<Kj=Kuj>}�(j<Kj=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjyjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $initialized�j7Kj8}�(j:}�(j<Kj=Kuj>}�(j<Kj=K%uuj@}�(j:}�(j<Kj=Kuj>}�(j<Kj=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkList�j7Kj8}�(j:}�(j<K"j=Kuj>}�(j<K"j=Kuuj@}�(j:}�(j<K"j=Kuj>}�(j<K"j=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�getChunk�j7Kj8}�(j:}�(j<K$j=Kuj>}�(j<K0j=Kuuj@}�(j:}�(j<K+j=Kuj>}�(j<K+j=KuujQ]�}�(j5�$chunkId�j7K j8}�(j:}�(j<K+j=Kuj>}�(j<K+j=K,uuj@}�(j:}�(j<K+j=K$uj>}�(j<K+j=K,uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uaj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�getChunksBySection�j7Kj8}�(j:}�(j<K2j=Kuj>}�(j<KSj=Kuuj@}�(j:}�(j<K:j=Kuj>}�(j<K:j=K&uujQ]�(}�(j5�$sdk�j7K j8}�(j:}�(j<K:j=K'uj>}�(j<K:j=K2uuj@}�(j:}�(j<K:j=K.uj>}�(j<K:j=K2uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$section�j7K j8}�(j:}�(j<K:j=K4uj>}�(j<K:j=KCuuj@}�(j:}�(j<K:j=K;uj>}�(j<K:j=KCuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkKey�j7K j8}�(j:}�(j<K=j=Kuj>}�(j<K=j=Kuuj@}�(j:}�(j<K=j=Kuj>}�(j<K=j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $sectionData�j7K j8}�(j:}�(j<KCj=Kuj>}�(j<KCj=Kuuj@}�(j:}�(j<KCj=Kuj>}�(j<KCj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $chunkIds�j7K j8}�(j:}�(j<KIj=Kuj>}�(j<KIj=Kuuj@}�(j:}�(j<KIj=Kuj>}�(j<KIj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunks�j7K j8}�(j:}�(j<KJj=Kuj>}�(j<KJj=Kuuj@}�(j:}�(j<KJj=Kuj>}�(j<KJj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<KLj=Kuj>}�(j<KLj=K&uuj@}�(j:}�(j<KLj=Kuj>}�(j<KLj=K&uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunks�j7K j8}�(j:}�(j<KNj=Kuj>}�(j<KNj=Kuuj@}�(j:}�(j<KNj=Kuj>}�(j<KNj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�getClassDocumentation�j7Kj8}�(j:}�(j<KUj=Kuj>}�(j<Kwj=Kuuj@}�(j:}�(j<K]j=Kuj>}�(j<K]j=K)uujQ]�(}�(j5�$sdk�j7K j8}�(j:}�(j<K]j=K*uj>}�(j<K]j=K5uuj@}�(j:}�(j<K]j=K1uj>}�(j<K]j=K5uuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj*jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $className�j7K j8}�(j:}�(j<K]j=K7uj>}�(j<K]j=KHuuj@}�(j:}�(j<K]j=K>uj>}�(j<K]j=KHuuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj6jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkKey�j7K j8}�(j:}�(j<K`j=Kuj>}�(j<K`j=Kuuj@}�(j:}�(j<K`j=Kuj>}�(j<K`j=Kuuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjBjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $classInfo�j7K j8}�(j:}�(j<Kfj=Kuj>}�(j<Kfj=Kuuj@}�(j:}�(j<Kfj=Kuj>}�(j<Kfj=Kuuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjNjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGu�j\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<Kgj=Kuj>}�(j<Kgj=Kuuj@}�(j:}�(j<Kgj=Kuj>}�(j<Kgj=Kuuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjZjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunk�j7K j8}�(j:}�(j<Kmj=Kuj>}�(j<Kmj=Kuuj@}�(j:}�(j<Kmj=Kuj>}�(j<Kmj=Kuuj^jjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjfjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj!jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�getMethodDocumentation�j7Kj8}�(j:}�(j<Kyj=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=K*uujQ]�(}�(j5�$sdk�j7K j8}�(j:}�(j<K�j=K+uj>}�(j<K�j=K6uuj@}�(j:}�(j<K�j=K2uj>}�(j<K�j=K6uuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj~jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $className�j7K j8}�(j:}�(j<K�j=K8uj>}�(j<K�j=KIuuj@}�(j:}�(j<K�j=K?uj>}�(j<K�j=KIuuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $methodName�j7K j8}�(j:}�(j<K�j=KKuj>}�(j<K�j=K]uuj@}�(j:}�(j<K�j=KRuj>}�(j<K�j=K]uuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $classDoc�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $methodInfo�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunk�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jsjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjujX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5� getSdkList�j7Kj8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�getSdkOverview�j7Kj8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=K"uujQ]�(}�(j5�$sdk�j7K j8}�(j:}�(j<K�j=K#uj>}�(j<K�j=K.uuj@}�(j:}�(j<K�j=K*uj>}�(j<K�j=K.uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkKey�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkData�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5� initialize�j7Kj8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� isInitialized�j7Kj8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=K!uuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� searchChunks�j7Kj8}�(j:}�(j<K�j=Kuj>}�(j<Mj=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=K uujQ]�(}�(j5�$query�j7K j8}�(j:}�(j<K�j=K!uj>}�(j<K�j=K.uuj@}�(j:}�(j<K�j=K(uj>}�(j<K�j=K.uuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj2jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<K�j=K0uj>}�(j<K�j=KCuuj@}�(j:}�(j<K�j=K8uj>}�(j<K�j=K<uuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj>jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$limit�j7K j8}�(j:}�(j<K�j=KEuj>}�(j<K�j=KTuuj@}�(j:}�(j<K�j=KIuj>}�(j<K�j=KOuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjJjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$results�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjVjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryLower�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjbjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<K�j=K"uj>}�(j<K�j=K*uuj@}�(j:}�(j<K�j=K"uj>}�(j<K�j=K*uuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjnjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunk�j7K j8}�(j:}�(j<K�j=K.uj>}�(j<K�j=K4uuj@}�(j:}�(j<K�j=K.uj>}�(j<K�j=K4uuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjzjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$content�j7K j8}�(j:}�(j<K�j=K uj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=K uj>}�(j<K�j=Kuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$score�j7K j8}�(j:}�(j<K�j=K uj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=K uj>}�(j<K�j=Kuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$results�j7K j8}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj@}�(j:}�(j<K�j=Kuj>}�(j<K�j=Kuuj^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�Closure�j7K j8}�(j:}�(j<Mj=K uj>}�(j<Mj=KNuuj@}�(j:}�(j<Mj=K uj>}�(j<Mj=KNuujQ]�(}�(j5�$a�j7K j8}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$b�j7K j8}�(j:}�(j<Mj=K!uj>}�(j<Mj=K)uuj@}�(j:}�(j<Mj=K'uj>}�(j<Mj=K)uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^j'jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuuej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj)jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5� buildIndex�j7Kj8}�(j:}�(j<M j=Kuj>}�(j<M$j=Kuuj@}�(j:}�(j<M j=Kuj>}�(j<M j=KuujQ]�(}�(j5�$sdkData�j7K j8}�(j:}�(j<M j=K!uj>}�(j<M j=K)uuj@}�(j:}�(j<M j=K!uj>}�(j<M j=K)uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $chunkIds�j7K j8}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$counter�j7K j8}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$i�j7K j8}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentId�j7K j8}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentId�j7K j8}�(j:}�(j<Mj=K"uj>}�(j<Mj=K,uuj@}�(j:}�(j<Mj=K"uj>}�(j<Mj=K,uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentId�j7K j8}�(j:}�(j<M j=K"uj>}�(j<M j=K,uuj@}�(j:}�(j<M j=K"uj>}�(j<M j=K,uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj"jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�calculateRelevanceScore�j7Kj8}�(j:}�(j<M&j=Kuj>}�(j<MKj=Kuuj@}�(j:}�(j<M+j=Kuj>}�(j<M+j=K,uujQ]�(}�(j5�$query�j7K j8}�(j:}�(j<M+j=K-uj>}�(j<M+j=K:uuj@}�(j:}�(j<M+j=K4uj>}�(j<M+j=K:uuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj:jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$content�j7K j8}�(j:}�(j<M+j=K<uj>}�(j<M+j=KKuuj@}�(j:}�(j<M+j=KCuj>}�(j<M+j=KKuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjFjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $metadata�j7K j8}�(j:}�(j<M+j=KMuj>}�(j<M+j=K\uuj@}�(j:}�(j<M+j=KSuj>}�(j<M+j=K\uuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjRjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$score�j7K j8}�(j:}�(j<M-j=Kuj>}�(j<M-j=Kuuj@}�(j:}�(j<M-j=Kuj>}�(j<M-j=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj^jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryTerms�j7K j8}�(j:}�(j<M.j=Kuj>}�(j<M.j=Kuuj@}�(j:}�(j<M.j=Kuj>}�(j<M.j=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryTerm�j7K j8}�(j:}�(j<M0j=K uj>}�(j<M0j=K*uuj@}�(j:}�(j<M0j=K uj>}�(j<M0j=K*uuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjvjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $termCount�j7K j8}�(j:}�(j<M1j=K uj>}�(j<M1j=Kuuj@}�(j:}�(j<M1j=K uj>}�(j<M1j=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$class�j7K j8}�(j:}�(j<M5j=K uj>}�(j<M5j=Kuuj@}�(j:}�(j<M5j=K uj>}�(j<M5j=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$method�j7K j8}�(j:}�(j<M<j=K uj>}�(j<M<j=Kuuj@}�(j:}�(j<M<j=K uj>}�(j<M<j=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$section�j7K j8}�(j:}�(j<MCj=K uj>}�(j<MCj=Kuuj@}�(j:}�(j<MCj=K uj>}�(j<MCj=Kuuj^j/jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj1jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5� createChunk�j7Kj8}�(j:}�(j<MMj=Kuj>}�(j<Mwj=Kuuj@}�(j:}�(j<MTj=Kuj>}�(j<MTj=K uujQ]�(}�(j5�$sdk�j7K j8}�(j:}�(j<MTj=K!uj>}�(j<MTj=K,uuj@}�(j:}�(j<MTj=K(uj>}�(j<MTj=K,uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$lines�j7K j8}�(j:}�(j<MTj=K.uj>}�(j<MTj=K:uuj@}�(j:}�(j<MTj=K4uj>}�(j<MTj=K:uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$section�j7K j8}�(j:}�(j<MTj=K<uj>}�(j<MTj=KLuuj@}�(j:}�(j<MTj=KDuj>}�(j<MTj=KLuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$class�j7K j8}�(j:}�(j<MTj=KNuj>}�(j<MTj=K\uuj@}�(j:}�(j<MTj=KVuj>}�(j<MTj=K\uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$method�j7K j8}�(j:}�(j<MTj=K^uj>}�(j<MTj=Kmuuj@}�(j:}�(j<MTj=Kfuj>}�(j<MTj=Kmuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$content�j7K j8}�(j:}�(j<MVj=Kuj>}�(j<MVj=Kuuj@}�(j:}�(j<MVj=Kuj>}�(j<MVj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<MWj=Kuj>}�(j<MWj=Kuuj@}�(j:}�(j<MWj=Kuj>}�(j<MWj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $metadata�j7K j8}�(j:}�(j<MYj=Kuj>}�(j<MYj=Kuuj@}�(j:}�(j<MYj=Kuj>}�(j<MYj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$chunkId�j7K j8}�(j:}�(j<Maj=Kuj>}�(j<Maj=Kuuj@}�(j:}�(j<Maj=Kuj>}�(j<Maj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<Mhj=Kuj>}�(j<Mhj=Kuuj@}�(j:}�(j<Mhj=Kuj>}�(j<Mhj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj*jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<Mkj=Kuj>}�(j<Mkj=Kuuj@}�(j:}�(j<Mkj=Kuj>}�(j<Mkj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj6jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$section�j7K j8}�(j:}�(j<Mkj=K+uj>}�(j<Mkj=K3uuj@}�(j:}�(j<Mkj=K+uj>}�(j<Mkj=K3uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjBjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<Mpj=Kuj>}�(j<Mpj=K!uuj@}�(j:}�(j<Mpj=Kuj>}�(j<Mpj=K!uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjNjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$class�j7K j8}�(j:}�(j<Mpj=K.uj>}�(j<Mpj=K4uuj@}�(j:}�(j<Mpj=K.uj>}�(j<Mpj=K4uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjZjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<Mtj=Kuj>}�(j<Mtj=K!uuj@}�(j:}�(j<Mtj=Kuj>}�(j<Mtj=K!uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjfjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$class�j7K j8}�(j:}�(j<Mtj=K.uj>}�(j<Mtj=K4uuj@}�(j:}�(j<Mtj=K.uj>}�(j<Mtj=K4uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjrjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$method�j7K j8}�(j:}�(j<Mtj=KAuj>}�(j<Mtj=KHuuj@}�(j:}�(j<Mtj=KAuj>}�(j<Mtj=KHuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj~jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�ensureInitialized�j7Kj8}�(j:}�(j<Myj=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M|j=Kuj>}�(j<M|j=K&uuj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�extractClassNameFromSource�j7Kj8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K/uujQ]�}�(j5� $sourceFile�j7K j8}�(j:}�(j<M�j=K0uj>}�(j<M�j=KBuuj@}�(j:}�(j<M�j=K7uj>}�(j<M�j=KBuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uaj^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�generatePreview�j7Kj8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K$uujQ]�(}�(j5�$content�j7K j8}�(j:}�(j<M�j=K%uj>}�(j<M�j=K4uuj@}�(j:}�(j<M�j=K,uj>}�(j<M�j=K4uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$query�j7K j8}�(j:}�(j<M�j=K6uj>}�(j<M�j=KCuuj@}�(j:}�(j<M�j=K=uj>}�(j<M�j=KCuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$previewLength�j7K j8}�(j:}�(j<M�j=KEuj>}�(j<M�j=K]uuj@}�(j:}�(j<M�j=KIuj>}�(j<M�j=KWuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryLower�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $contentLower�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $position�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryTerms�j7K j8}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $queryTerm�j7K j8}�(j:}�(j<M�j=K$uj>}�(j<M�j=K.uuj@}�(j:}�(j<M�j=K$uj>}�(j<M�j=K.uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $position�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $position�j7K j8}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj&jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$start�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj2jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$end�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=K uuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj>jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$preview�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjJjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$preview�j7K j8}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjVjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�parseDocumentationFile�j7Kj8}�(j:}�(j<M�j=Kuj>}�(j<M!j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K+uujQ]�(}�(j5�$file�j7K j8}�(j:}�(j<M�j=K,uj>}�(j<M�j=K8uuj@}�(j:}�(j<M�j=K3uj>}�(j<M�j=K8uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjnjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<M�j=K:uj>}�(j<M�j=KEuuj@}�(j:}�(j<M�j=KAuj>}�(j<M�j=KEuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjzjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$content�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$lines�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentMethod�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $lineNumber�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$inSourceBlock�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$line�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=K uuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=K!uuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K!uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=K!uuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K!uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$inSourceBlock�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj"jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj.jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$inSourceBlock�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj:jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjFjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentMethod�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjRjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj^jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<M�j=K!uj>}�(j<M�j=K%uuj@}�(j:}�(j<M�j=K!uj>}�(j<M�j=K%uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjvjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M�j=K3uj>}�(j<M�j=KBuuj@}�(j:}�(j<M�j=K3uj>}�(j<M�j=KBuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<Mj=K!uj>}�(j<Mj=K%uuj@}�(j:}�(j<Mj=K!uj>}�(j<Mj=K%uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<Mj=K2uj>}�(j<Mj=K?uuj@}�(j:}�(j<Mj=K2uj>}�(j<Mj=K?uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentMethod�j7K j8}�(j:}�(j<M j=Kuj>}�(j<M j=Kuuj@}�(j:}�(j<M j=Kuj>}�(j<M j=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdk�j7K j8}�(j:}�(j<M j=K!uj>}�(j<M j=K%uuj@}�(j:}�(j<M j=K!uj>}�(j<M j=K%uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $currentClass�j7K j8}�(j:}�(j<M j=K2uj>}�(j<M j=K?uuj@}�(j:}�(j<M j=K2uj>}�(j<M j=K?uuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentMethod�j7K j8}�(j:}�(j<M j=KLuj>}�(j<M j=KZuuj@}�(j:}�(j<M j=KLuj>}�(j<M j=KZuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=K uj>}�(j<Mj=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj@}�(j:}�(j<Mj=Kuj>}�(j<Mj=Kuuj^jcjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjejX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�parseGeneralDocumentation�j7Kj8}�(j:}�(j<M#j=Kuj>}�(j<Mnj=Kuuj@}�(j:}�(j<M#j=Kuj>}�(j<M#j=K.uujQ]�(}�(j5�$file�j7K j8}�(j:}�(j<M#j=K/uj>}�(j<M#j=K;uuj@}�(j:}�(j<M#j=K6uj>}�(j<M#j=K;uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$key�j7K j8}�(j:}�(j<M#j=K=uj>}�(j<M#j=KHuuj@}�(j:}�(j<M#j=KDuj>}�(j<M#j=KHuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$content�j7K j8}�(j:}�(j<M%j=Kuj>}�(j<M%j=Kuuj@}�(j:}�(j<M%j=Kuj>}�(j<M%j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$lines�j7K j8}�(j:}�(j<M+j=Kuj>}�(j<M+j=Kuuj@}�(j:}�(j<M+j=Kuj>}�(j<M+j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj*jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M,j=Kuj>}�(j<M,j=Kuuj@}�(j:}�(j<M,j=Kuj>}�(j<M,j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj6jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M-j=Kuj>}�(j<M-j=Kuuj@}�(j:}�(j<M-j=Kuj>}�(j<M-j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjBjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $lineNumber�j7K j8}�(j:}�(j<M.j=Kuj>}�(j<M.j=Kuuj@}�(j:}�(j<M.j=Kuj>}�(j<M.j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjNjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$line�j7K j8}�(j:}�(j<M0j=Kuj>}�(j<M0j=K uuj@}�(j:}�(j<M0j=Kuj>}�(j<M0j=K uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjZjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<M7j=Kuj>}�(j<M7j=Kuuj@}�(j:}�(j<M7j=Kuj>}�(j<M7j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjfjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M;j=Kuj>}�(j<M;j=Kuuj@}�(j:}�(j<M;j=Kuj>}�(j<M;j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjrjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$cleaned�j7K j8}�(j:}�(j<M?j=Kuj>}�(j<M?j=Kuuj@}�(j:}�(j<M?j=Kuj>}�(j<M?j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj~jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M@j=Kuj>}�(j<M@j=Kuuj@}�(j:}�(j<M@j=Kuj>}�(j<M@j=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MCj=Kuj>}�(j<MCj=Kuuj@}�(j:}�(j<MCj=Kuj>}�(j<MCj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$cleaned�j7K j8}�(j:}�(j<MEj=Kuj>}�(j<MEj=Kuuj@}�(j:}�(j<MEj=Kuj>}�(j<MEj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MFj=Kuj>}�(j<MFj=Kuuj@}�(j:}�(j<MFj=Kuj>}�(j<MFj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MHj=Kuj>}�(j<MHj=Kuuj@}�(j:}�(j<MHj=Kuj>}�(j<MHj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$cleaned�j7K j8}�(j:}�(j<MJj=Kuj>}�(j<MJj=Kuuj@}�(j:}�(j<MJj=Kuj>}�(j<MJj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MKj=Kuj>}�(j<MKj=Kuuj@}�(j:}�(j<MKj=Kuj>}�(j<MKj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MLj=Kuj>}�(j<MLj=Kuuj@}�(j:}�(j<MLj=Kuj>}�(j<MLj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MPj=Kuj>}�(j<MPj=K#uuj@}�(j:}�(j<MPj=Kuj>}�(j<MPj=K#uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MRj=Kuj>}�(j<MRj=K#uuj@}�(j:}�(j<MRj=Kuj>}�(j<MRj=K#uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MSj=Kuj>}�(j<MSj=K#uuj@}�(j:}�(j<MSj=Kuj>}�(j<MSj=K#uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<MWj=Kuj>}�(j<MWj=K'uuj@}�(j:}�(j<MWj=Kuj>}�(j<MWj=K'uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$key�j7K j8}�(j:}�(j<M\j=K!uj>}�(j<M\j=K%uuj@}�(j:}�(j<M\j=K!uj>}�(j<M\j=K%uuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$currentSection�j7K j8}�(j:}�(j<M\j=K3uj>}�(j<M\j=KBuuj@}�(j:}�(j<M\j=K3uj>}�(j<M\j=KBuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj& jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<Mcj=K uj>}�(j<Mcj=Kuuj@}�(j:}�(j<Mcj=K uj>}�(j<Mcj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj2 jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$buffer�j7K j8}�(j:}�(j<Mgj=Kuj>}�(j<Mgj=Kuuj@}�(j:}�(j<Mgj=Kuj>}�(j<Mgj=Kuuj^j�jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj> jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj�jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuu}�(j5�scanDocumentationFiles�j7Kj8}�(j:}�(j<Mpj=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<Msj=Kuj>}�(j<Msj=K+uujQ]�(}�(j5�$files�j7K j8}�(j:}�(j<Myj=Kuj>}�(j<Myj=Kuuj@}�(j:}�(j<Myj=Kuj>}�(j<Myj=Kuuj^jK jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjV jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$file�j7K j8}�(j:}�(j<Mj=Kuj>}�(j<Mj=K uuj@}�(j:}�(j<Mj=Kuj>}�(j<Mj=K uuj^jK jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjb jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5� $filename�j7K j8}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=K uj>}�(j<M�j=Kuuj^jK jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjn jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkName�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=Kuuj^jK jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjz jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�u}�(j5�$sdkName�j7K j8}�(j:}�(j<M�j=Kuj>}�(j<M�j=K%uuj@}�(j:}�(j<M�j=Kuj>}�(j<M�j=K%uuj^jK jS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWj� jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj\]�uej^jIjS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjM jX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuuejS}�(jU�Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jWjKjX�S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�jZjGuj^NujSj_jkjwj�j�j�j�j�j�j�j�j�j�j�jjjj(j4j@jLjXjdjsj|j�j�j�j�j�j�j�j�j�j�jjjj'j0j<jHjTj`jljxj�j�j�j�j�j�j�j�j�j�j�jjj j/j8jDjPj\jhjtj�j�j�j�j�j�j�j�j�j�j�jjjj(j4j@jLjXjdjpj|j�j�j�j�j�j�j�j�j�j�jj jj$j0j<jHjTjcjljxj�j�j�j�j�j�j�j�j�j�j�jjj j,j8jDjPj\jhjtj�j�j�j�j�j�j�j�j�j�j�jjjj(j4j@jLjXjdjpj|j�j�j�j�j�j�j�j�j�j�j j j j$ j0 j< jK jT j` jl jx j� e]�(j4jIe�����1tests/Unit/Tools/DocumentationToolsTest.php-False�� 0e485d967d6978dcf6a2168061ac6d8d�]�(}�(�name��Closure��kind�K �range�}�(�start�}�(�line�K� character�Ku�end�}�(j� M�j� Kuu�selectionRange�}�(j� }�(j� Kj� Kuj� }�(j� M�j� Kuu�children�]�(}�(j� �Closure�j� K j� }�(j� }�(j� Kj� Kuj� }�(j� K j� Kuuj� }�(j� }�(j� Kj� Kuj� }�(j� K j� Kuujj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j��+tests/Unit/Tools/DocumentationToolsTest.php�uj�]�u}�(j� �Closure�j� K j� }�(j� }�(j� K j� Kuj� }�(j� Kj� Kuuj� }�(j� }�(j� K j� Kuj� }�(j� Kj� Kuujj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �Closure�j� K j� }�(j� }�(j� Kj� K$uj� }�(j� Klj� Kuuj� }�(j� }�(j� Kj� K$uj� }�(j� Klj� Kuuj� ]�(}�(j� �Closure�j� K j� }�(j� }�(j� Kj� K,uj� }�(j� Kj� K uuj� }�(j� }�(j� Kj� K,uj� }�(j� Kj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuuj� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuujj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Kj� K.uj� }�(j� Kj� K uuj� }�(j� }�(j� Kj� K.uj� }�(j� Kj� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuuj� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuujj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuuj� }�(j� }�(j� Kj� K uj� }�(j� Kj� Kuujj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Kj� K0uj� }�(j� K"j� K uuj� }�(j� }�(j� Kj� K0uj� }�(j� K"j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K j� K uj� }�(j� K j� Kuuj� }�(j� }�(j� K j� K uj� }�(j� K j� Kuujj !j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K$j� K4uj� }�(j� K(j� K uuj� }�(j� }�(j� K$j� K4uj� }�(j� K(j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K%j� K uj� }�(j� K%j� Kuuj� }�(j� }�(j� K%j� K uj� }�(j� K%j� Kuujj$!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j/!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j&!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K*j� K,uj� }�(j� K.j� K uuj� }�(j� }�(j� K*j� K,uj� }�(j� K.j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K+j� K uj� }�(j� K+j� Kuuj� }�(j� }�(j� K+j� K uj� }�(j� K+j� Kuujj<!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jG!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j>!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K0j� K,uj� }�(j� K6j� K uuj� }�(j� }�(j� K0j� K,uj� }�(j� K6j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K1j� K uj� }�(j� K1j� Kuuj� }�(j� }�(j� K1j� K uj� }�(j� K1j� KuujjT!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j_!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jV!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure��j� K j� }�(j� }�(j� K8j� K.uj� }�(j� K>j� K uuj� }�(j� }�(j� K8j� K.uj� }�(j� K>j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K9j� K uj� }�(j� K9j� Kuuj� }�(j� }�(j� K9j� K uj� }�(j� K9j� Kuujjl!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jw!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jn!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K@j� K$uj� }�(j� KEj� K uuj� }�(j� }�(j� K@j� K$uj� }�(j� KEj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� KAj� K uj� }�(j� KAj� Kuuj� }�(j� }�(j� KAj� K uj� }�(j� KAj� Kuujj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� KGj� K%uj� }�(j� KLj� K uuj� }�(j� }�(j� KGj� K%uj� }�(j� KLj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� KHj� K uj� }�(j� KHj� Kuuj� }�(j� }�(j� KHj� K uj� }�(j� KHj� Kuujj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� KNj� K&uj� }�(j� KSj� K uuj� }�(j� }�(j� KNj� K&uj� }�(j� KSj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� KOj� K uj� }�(j� KOj� Kuuj� }�(j� }�(j� KOj� K uj� }�(j� KOj� Kuujj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� KUj� K*uj� }�(j� K_j� K uuj� }�(j� }�(j� KUj� K*uj� }�(j� K_j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� KVj� K uj� }�(j� KVj� Kuuj� }�(j� }�(j� KVj� K uj� }�(j� KVj� Kuujj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Kaj� K2uj� }�(j� Kkj� K uuj� }�(j� }�(j� Kaj� K2uj� }�(j� Kkj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� Kbj� K uj� }�(j� Kbj� Kuuj� }�(j� }�(j� Kbj� K uj� }�(j� Kbj� Kuujj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�!j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Knj� K#uj� }�(j� K�j� Kuuj� }�(j� }�(j� Knj� K#uj� }�(j� K�j� Kuuj� ]�(}�(j� �Closure�j� K j� }�(j� }�(j� Koj� K,uj� }�(j� Krj� K uuj� }�(j� }�(j� Koj� K,uj� }�(j� Krj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� Kpj� K uj� }�(j� Kpj� Kuuj� }�(j� }�(j� Kpj� K uj� }�(j� Kpj� Kuujj"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j "j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Ktj� K.uj� }�(j� Kzj� K uuj� }�(j� }�(j� Ktj� K.uj� }�(j� Kzj� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� Kuj� K uj� }�(j� Kuj� Kuuj� }�(j� }�(j� Kuj� K uj� }�(j� Kuj� Kuujj "j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j+"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Kxj� K uj� }�(j� Kxj� Kuuj� }�(j� }�(j� Kxj� K uj� }�(j� Kxj� Kuujj "j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j7"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j""j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K|j� K0uj� }�(j� Kj� K uuj� }�(j� }�(j� K|j� K0uj� }�(j� Kj� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K}j� K uj� }�(j� K}j� Kuuj� }�(j� }�(j� K}j� K uj� }�(j� K}j� KuujjD"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jO"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jF"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K1uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K1uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj\"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jg"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j^"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K)uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K)uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujjt"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jv"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K3uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K3uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K2uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K2uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K*uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K*uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K2uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K2uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�"j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K-uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K-uj� }�(j� K�j� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j'#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�!j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j"j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K)uj� }�(j� MAj� Kuuj� }�(j� }�(j� K�j� K)uj� }�(j� MAj� Kuuj� ]�(}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj@#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jK#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jB#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K=uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K=uj� }�(j� K�j� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� KuujjX#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jc#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� KuujjX#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jo#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jZ#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K.uj� }�(j� K�j� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj|#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj|#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j~#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K,uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K,uj� }�(j� K�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K*uj� }�(j� K�j� K uuj� }�(j� }�(j� K�j� K*uj� }�(j� K�j� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� K�j� K:uj� }�(j� Mj� K uuj� }�(j� }�(j� K�j� K:uj� }�(j� Mj� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuuj� }�(j� }�(j� K�j� K uj� }�(j� K�j� Kuujj�#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Mj� K,uj� }�(j� Mj� K uuj� }�(j� }�(j� Mj� K,uj� }�(j� Mj� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuuj� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuujj$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j $j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result1�j� K j� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuuj� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuujj$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result2�j� K j� }�(j� }�(j� M j� K uj� }�(j� M j� Kuuj� }�(j� }�(j� M j� K uj� }�(j� M j� Kuujj$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j#$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Mj� K&uj� }�(j� Mj� K uuj� }�(j� }�(j� Mj� K&uj� }�(j� Mj� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuuj� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuujj0$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j;$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuuj� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuujj0$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jG$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j2$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Mj� K2uj� }�(j� M)j� K uuj� }�(j� }�(j� Mj� K2uj� }�(j� M)j� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� Mj� K uj� }�(j� Mj� Kuuj� }�(j� }�(j� Mj� K uj� }�(j� Mj� KuujjT$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j_$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� M j� K uj� }�(j� M j� Kuuj� }�(j� }�(j� M j� K uj� }�(j� M j� KuujjT$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jk$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jV$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M+j� K/uj� }�(j� M7j� K uuj� }�(j� }�(j� M+j� K/uj� }�(j� M7j� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� M,j� K uj� }�(j� M,j� Kuuj� }�(j� }�(j� M,j� K uj� }�(j� M,j� Kuujjx$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� M4j� K uj� }�(j� M4j� Kuuj� }�(j� }�(j� M4j� K uj� }�(j� M4j� Kuujjx$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jz$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M9j� K*uj� }�(j� M@j� K uuj� }�(j� }�(j� M9j� K*uj� }�(j� M@j� K uuj� ]�(}�(j� �$content�j� K j� }�(j� }�(j� M:j� K uj� }�(j� M:j� Kuuj� }�(j� }�(j� M:j� K uj� }�(j� M:j� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� M;j� K uj� }�(j� M;j� Kuuj� }�(j� }�(j� M;j� K uj� }�(j� M;j� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj7#j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j9#j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� MCj� Kuj� }�(j� M|j� Kuuj� }�(j� }�(j� MCj� Kuj� }�(j� M|j� Kuuj� ]�(}�(j� �Closure�j� K j� }�(j� }�(j� MDj� K7uj� }�(j� MMj� K uuj� }�(j� }�(j� MDj� K7uj� }�(j� MMj� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� MEj� K uj� }�(j� MEj� Kuuj� }�(j� }�(j� MEj� K uj� }�(j� MEj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� MHj� K uj� }�(j� MHj� Kuuj� }�(j� }�(j� MHj� K uj� }�(j� MHj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� MKj� K uj� }�(j� MKj� Kuuj� }�(j� }�(j� MKj� K uj� }�(j� MKj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� MOj� K3uj� }�(j� MYj� K uuj� }�(j� }�(j� MOj� K3uj� }�(j� MYj� K uuj� ]�(}�(j� � $longQuery�j� K j� }�(j� }�(j� MPj� K uj� }�(j� MPj� Kuuj� }�(j� }�(j� MPj� K uj� }�(j� MPj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� MRj� K uj� }�(j� MRj� Kuuj� }�(j� }�(j� MRj� K uj� }�(j� MRj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� MVj� K uj� }�(j� MVj� Kuuj� }�(j� }�(j� MVj� K uj� }�(j� MVj� Kuujj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M[j� K4uj� }�(j� Mej� K uuj� }�(j� }�(j� M[j� K4uj� }�(j� Mej� K uuj� ]�(}�(j� � $specialQuery�j� K j� }�(j� }�(j� M\j� K uj� }�(j� M\j� Kuuj� }�(j� }�(j� M\j� K uj� }�(j� M\j� Kuujj,%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j7%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� M^j� K uj� }�(j� M^j� Kuuj� }�(j� }�(j� M^j� K uj� }�(j� M^j� Kuujj,%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jC%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Mbj� K uj� }�(j� Mbj� Kuuj� }�(j� }�(j� Mbj� K uj� }�(j� Mbj� Kuujj,%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jO%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j.%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Mgj� K4uj� }�(j� Mmj� K uuj� }�(j� }�(j� Mgj� K4uj� }�(j� Mmj� K uuj� ]�(}�(j� �$unicodeContent�j� K j� }�(j� }�(j� Mhj� K uj� }�(j� Mhj� Kuuj� }�(j� }�(j� Mhj� K uj� }�(j� Mhj� Kuujj\%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�jg%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Mjj� K uj� }�(j� Mjj� Kuuj� }�(j� }�(j� Mjj� K uj� }�(j� Mjj� Kuujj\%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�js%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j^%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� Moj� K3uj� }�(j� M{j� K uuj� }�(j� }�(j� Moj� K3uj� }�(j� M{j� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� Mpj� K uj� }�(j� Mpj� Kuuj� }�(j� }�(j� Mpj� K uj� }�(j� Mpj� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Mtj� K uj� }�(j� Mtj� Kuuj� }�(j� }�(j� Mtj� K uj� }�(j� Mtj� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� �$result�j� K j� }�(j� }�(j� Mxj� K uj� }�(j� Mxj� Kuuj� }�(j� }�(j� Mxj� K uj� }�(j� Mxj� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�$j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�$j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M~j� K$uj� }�(j� M�j� Kuuj� }�(j� }�(j� M~j� K$uj� }�(j� M�j� Kuuj� ]�(}�(j� �Closure�j� K j� }�(j� }�(j� Mj� K/uj� }�(j� M�j� K uuj� }�(j� }�(j� Mj� K/uj� }�(j� M�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuuj� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M�j� K+uj� }�(j� M�j� K uuj� }�(j� }�(j� M�j� K+uj� }�(j� M�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuuj� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M�j� K9uj� }�(j� M�j� K uuj� }�(j� }�(j� M�j� K9uj� }�(j� M�j� K uuj� ]�(}�(j� �$result�j� K j� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuuj� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�u}�(j� � $totalPages�j� K j� }�(j� }�(j� M�j� Kuj� }�(j� M�j� Kuuj� }�(j� }�(j� M�j� Kuj� }�(j� M�j� Kuujj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j&j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uejj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uu}�(j� �Closure�j� K j� }�(j� }�(j� M�j� K7uj� }�(j� M�j� K uuj� }�(j� }�(j� M�j� K7uj� }�(j� M�j� K uuj� ]�}�(j� �$result�j� K j� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuuj� }�(j� }�(j� M�j� K uj� }�(j� M�j� Kuujj&j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j&j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uj�]�uajj�%j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j&j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuejj� j�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j�%j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� uuej�}�(j��]file:///Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� j��V/Users/evan/Developer/evansims/openfga-mcp/tests/Unit/Tools/DocumentationToolsTest.php�j�j� ujNuj� j� j� j� j� j� j� j� j !j!j$!j-!j<!jE!jT!j]!jl!ju!j�!j�!j�!j�!j�!j�!j�!j�!j�!j�!j�!j"j"j "j)"j5"jD"jM"j\"je"jt"j}"j�"j�"j�"j�"j�"j�"j�"j�"j�"j�"j#j #j#j%#j7#j@#jI#jX#ja#jm#j|#j�#j�#j�#j�#j�#j�#j�#j�#j�#j�#j$j $j$j!$j0$j9$jE$jT$j]$ji$jx$j�$j�$j�$j�$j�$j�$j�$j�$j�$j�$j�$j%j%j%j,%j5%jA%jM%j\%je%jq%j�%j�%j�%j�%j�%j�%j�%j�%j�%j�%j�%j&j&j&e]�j� a�����-src/Documentation/DocumentationIndex.php-True�� 7f4754eca9fb123374b9385b79b211a8�]�(}�(�name��OpenFGA\MCP\Documentation��kind�K�range�}�(�start�}�(�line�K� character�Ku�end�}�(j<&Kj=&K$uu�selectionRange�}�(j:&}�(j<&Kj=&K uj>&}�(j<&Kj=&K#uuj�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j9&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j��(src/Documentation/DocumentationIndex.php�uj��$namespace OpenFGA\MCP\Documentation;�j�]�jNu}�(j5&�DocumentationIndex�j7&Kj8&}�(j:&}�(j<&K j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&K j=&K uj>&}�(j<&K j=&Kuu�children�]�(}�(j5&�CHUNK_SIZE_LIMIT�j7&Kj8&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&K-uuj@&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&K&uujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jV&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��CHUNK_SIZE_LIMIT = 5000;�j�]�u}�(j5&� DOCS_PATH�j7&Kj8&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&K<uuj@&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&K"uujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jc&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$DOCS_PATH = __DIR__ . '/../../docs';�j�]�u}�(j5&�$chunks�j7&Kj8&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&Kuuj@&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jp&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $chunks = [];�j�]�u}�(j5&�$index�j7&Kj8&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&Kuuj@&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j}&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $index = [];�j�]�u}�(j5&� $initialized�j7&Kj8&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&K%uuj@&}�(j:&}�(j<&Kj=&Kuj>&}�(j<&Kj=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$initialized = false;�j�]�u}�(j5&�$sdkList�j7&Kj8&}�(j:&}�(j<&K"j=&Kuj>&}�(j<&K"j=&Kuuj@&}�(j:&}�(j<&K"j=&Kuj>&}�(j<&K"j=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$sdkList = [];�j�]�u}�(j5&�getChunk�j7&Kj8&}�(j:&}�(j<&K$j=&Kuj>&}�(j<&K0j=&Kuuj@&}�(j:&}�(j<&K+j=&Kuj>&}�(j<&K+j=&KuujR&]�}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&K+j=&Kuj>&}�(j<&K+j=&K,uuj@&}�(j:&}�(j<&K+j=&K$uj>&}�(j<&K+j=&K,uujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $chunkId): ?array�j�]�uajjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param string $chunkId * * @throws RuntimeException * * @return array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}|null */ public function getChunk(string $chunkId): ?array { $this->ensureInitialized(); return $this->chunks[$chunkId] ?? null; }�u}�(j5&� getChunkById�j7&Kj8&}�(j:&}�(j<&K2j=&Kuj>&}�(j<&K;j=&Kuuj@&}�(j:&}�(j<&K8j=&Kuj>&}�(j<&K8j=&K uujR&]�}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&K8j=&K!uj>&}�(j<&K8j=&K0uuj@&}�(j:&}�(j<&K8j=&K(uj>&}�(j<&K8j=&K0uujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $chunkId): ?array�j�]�uajjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�Xx/** * Get a specific chunk by its ID. * * @param string $chunkId * @return array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}|null */ public function getChunkById(string $chunkId): ?array { return $this->chunks[$chunkId] ?? null; }�u}�(j5&�getChunksBySection�j7&Kj8&}�(j:&}�(j<&K=j=&Kuj>&}�(j<&K^j=&Kuuj@&}�(j:&}�(j<&KEj=&Kuj>&}�(j<&KEj=&K&uujR&]�(}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&KEj=&K'uj>&}�(j<&KEj=&K2uuj@&}�(j:&}�(j<&KEj=&K.uj>&}�(j<&KEj=&K2uujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$string $sdk, string $section): array�j�]�u}�(j5&�$section�j7&K j8&}�(j:&}�(j<&KEj=&K4uj>&}�(j<&KEj=&KCuuj@&}�(j:&}�(j<&KEj=&K;uj>&}�(j<&KEj=&KCuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $section): array�j�]�u}�(j5&�$sdkKey�j7&K j8&}�(j:&}�(j<&KHj=&Kuj>&}�(j<&KHj=&Kuuj@&}�(j:&}�(j<&KHj=&Kuj>&}�(j<&KHj=&Kuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$sdkKey = strtolower($sdk);�j�]�u}�(j5&� $sectionData�j7&K j8&}�(j:&}�(j<&KNj=&Kuj>&}�(j<&KNj=&Kuuj@&}�(j:&}�(j<&KNj=&Kuj>&}�(j<&KNj=&Kuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��C$sectionData = $this->index[$sdkKey]['sections'][$section] ?? null;�j�]�u}�(j5&� $chunkIds�j7&K j8&}�(j:&}�(j<&KTj=&Kuj>&}�(j<&KTj=&Kuuj@&}�(j:&}�(j<&KTj=&Kuj>&}�(j<&KTj=&Kuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$chunkIds = $sectionData['chunks'];�j�]�u}�(j5&�$chunks�j7&K j8&}�(j:&}�(j<&KUj=&Kuj>&}�(j<&KUj=&Kuuj@&}�(j:&}�(j<&KUj=&Kuj>&}�(j<&KUj=&Kuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j"'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $chunks = [];�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&KWj=&Kuj>&}�(j<&KWj=&K&uuj@&}�(j:&}�(j<&KWj=&Kuj>&}�(j<&KWj=&K&uujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j/'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $chunkId) {�j�]�u}�(j5&�$chunks�j7&K j8&}�(j:&}�(j<&KYj=&Kuj>&}�(j<&KYj=&Kuuj@&}�(j:&}�(j<&KYj=&Kuj>&}�(j<&KYj=&Kuujj�&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j<'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$chunks[] = $this->chunks[$chunkId];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param string $sdk * @param string $section * * @throws RuntimeException * * @return array<array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}> */ public function getChunksBySection(string $sdk, string $section): array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey]['sections'][$section])) { return []; } $sectionData = $this->index[$sdkKey]['sections'][$section] ?? null; if (null === $sectionData) { return []; } $chunkIds = $sectionData['chunks']; $chunks = []; foreach ($chunkIds as $chunkId) { if (isset($this->chunks[$chunkId])) { $chunks[] = $this->chunks[$chunkId]; } } return $chunks; }�u}�(j5&�getClassDocumentation�j7&Kj8&}�(j:&}�(j<&K`j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&Khj=&Kuj>&}�(j<&Khj=&K)uujR&]�(}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&Khj=&K*uj>&}�(j<&Khj=&K5uuj@&}�(j:&}�(j<&Khj=&K1uj>&}�(j<&Khj=&K5uujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jV'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��'string $sdk, string $className): ?array�j�]�u}�(j5&� $className�j7&K j8&}�(j:&}�(j<&Khj=&K7uj>&}�(j<&Khj=&KHuuj@&}�(j:&}�(j<&Khj=&K>uj>&}�(j<&Khj=&KHuujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jc'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $className): ?array�j�]�u}�(j5&�$sdkKey�j7&K j8&}�(j:&}�(j<&Kkj=&Kuj>&}�(j<&Kkj=&Kuuj@&}�(j:&}�(j<&Kkj=&Kuj>&}�(j<&Kkj=&KuujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jp'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$sdkKey = strtolower($sdk);�j�]�u}�(j5&� $classInfo�j7&K j8&}�(j:&}�(j<&Kqj=&Kuj>&}�(j<&Kqj=&Kuuj@&}�(j:&}�(j<&Kqj=&Kuj>&}�(j<&Kqj=&KuujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j}'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��:$classInfo = $this->index[$sdkKey]['classes'][$className];�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&Krj=&Kuj>&}�(j<&Krj=&Kuuj@&}�(j:&}�(j<&Krj=&Kuj>&}�(j<&Krj=&KuujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��"$chunkId = $classInfo['chunk_id'];�j�]�u}�(j5&�$chunk�j7&K j8&}�(j:&}�(j<&Kxj=&Kuj>&}�(j<&Kxj=&Kuuj@&}�(j:&}�(j<&Kxj=&Kuj>&}�(j<&Kxj=&KuujjK'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$chunk = $this->chunks[$chunkId];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jM'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param string $sdk * @param string $className * * @throws RuntimeException * * @return array{class: string, sdk: string, namespace: string|null, methods: array<string, array{signature: string|null, parameters: array<mixed>, returns: string|null, chunk_id: string|null}>, content: string, metadata: array<mixed>}|null */ public function getClassDocumentation(string $sdk, string $className): ?array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey]['classes'][$className])) { return null; } $classInfo = $this->index[$sdkKey]['classes'][$className]; $chunkId = $classInfo['chunk_id']; if (null === $chunkId || ! isset($this->chunks[$chunkId])) { return null; } $chunk = $this->chunks[$chunkId]; return [ 'class' => $className, 'sdk' => $sdkKey, 'namespace' => $classInfo['namespace'], 'methods' => $classInfo['methods'], 'content' => $chunk['content'], 'metadata' => $chunk['metadata'], ]; }�u}�(j5&�getMethodDocumentation�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&K*uujR&]�(}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&K�j=&K+uj>&}�(j<&K�j=&K6uuj@&}�(j:&}�(j<&K�j=&K2uj>&}�(j<&K�j=&K6uujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��;string $sdk, string $className, string $methodName): ?array�j�]�u}�(j5&� $className�j7&K j8&}�(j:&}�(j<&K�j=&K8uj>&}�(j<&K�j=&KIuuj@&}�(j:&}�(j<&K�j=&K?uj>&}�(j<&K�j=&KIuujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.string $className, string $methodName): ?array�j�]�u}�(j5&� $methodName�j7&K j8&}�(j:&}�(j<&K�j=&KKuj>&}�(j<&K�j=&K]uuj@&}�(j:&}�(j<&K�j=&KRuj>&}�(j<&K�j=&K]uujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $methodName): ?array�j�]�u}�(j5&� $classDoc�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��;$classDoc = $this->getClassDocumentation($sdk, $className);�j�]�u}�(j5&� $methodInfo�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��0$methodInfo = $classDoc['methods'][$methodName];�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$chunkId = $methodInfo['chunk_id'];�j�]�u}�(j5&�$chunk�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj�'j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$chunk = $this->chunks[$chunkId];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�'j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param string $sdk * @param string $className * @param string $methodName * * @throws RuntimeException * * @return array{method: string, class: string, sdk: string, signature: string|null, parameters: array<mixed>, returns: string|null, content: string}|null */ public function getMethodDocumentation(string $sdk, string $className, string $methodName): ?array { $this->ensureInitialized(); $classDoc = $this->getClassDocumentation($sdk, $className); if (null === $classDoc || ! isset($classDoc['methods'][$methodName])) { return null; } $methodInfo = $classDoc['methods'][$methodName]; $chunkId = $methodInfo['chunk_id']; if (null === $chunkId || ! isset($this->chunks[$chunkId])) { return null; } $chunk = $this->chunks[$chunkId]; return [ 'method' => $methodName, 'class' => $className, 'sdk' => $sdk, 'signature' => $methodInfo['signature'], 'parameters' => $methodInfo['parameters'], 'returns' => $methodInfo['returns'], 'content' => $chunk['content'], ]; }�u}�(j5&� getSdkList�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj���/** * @throws RuntimeException * * @return array<string> */ public function getSdkList(): array { $this->ensureInitialized(); return $this->sdkList; }�j�]�u}�(j5&�getSdkOverview�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&K"uujR&]�(}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&K�j=&K#uj>&}�(j<&K�j=&K.uuj@&}�(j:&}�(j<&K�j=&K*uj>&}�(j<&K�j=&K.uujj(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j&(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $sdk): ?array�j�]�u}�(j5&�$sdkKey�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j3(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$sdkKey = strtolower($sdk);�j�]�u}�(j5&�$sdkData�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujj(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j@(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$sdkData = $this->index[$sdkKey];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param string $sdk * * @throws RuntimeException * * @return array{sdk: string, name: string, file: string, sections: array<string>, classes: array<string>, total_chunks: int, source: string|null, generated: string|null}|null */ public function getSdkOverview(string $sdk): ?array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey])) { return null; } $sdkData = $this->index[$sdkKey]; return [ 'sdk' => $sdkKey, 'name' => $sdkData['name'], 'file' => $sdkData['file'], 'sections' => array_keys($sdkData['sections'] ?? []), 'classes' => array_keys($sdkData['classes'] ?? []), 'total_chunks' => count($sdkData['chunks'] ?? []), 'source' => $sdkData['source'] ?? null, 'generated' => $sdkData['generated'] ?? null, ]; }�u}�(j5&� initialize�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&KuujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jQ(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X/** * @throws RuntimeException */ public function initialize(): void { if ($this->initialized) { return; } $this->scanDocumentationFiles(); $this->buildIndex(); $this->initialized = true; }�j�]�u}�(j5&� isInitialized�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&K!uujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j^(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��Tpublic function isInitialized(): bool { return $this->initialized; }�j�]�u}�(j5&� searchChunks�j7&Kj8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&Mj=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&K uujR&]�(}�(j5&�$query�j7&K j8&}�(j:&}�(j<&K�j=&K!uj>&}�(j<&K�j=&K.uuj@&}�(j:&}�(j<&K�j=&K(uj>&}�(j<&K�j=&K.uujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jt(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��;string $query, ?string $sdk = null, int $limit = 10): array�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&K�j=&K0uj>&}�(j<&K�j=&KCuuj@&}�(j:&}�(j<&K�j=&K8uj>&}�(j<&K�j=&K<uujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��,?string $sdk = null, int $limit = 10): array�j�]�u}�(j5&�$limit�j7&K j8&}�(j:&}�(j<&K�j=&KEuj>&}�(j<&K�j=&KTuuj@&}�(j:&}�(j<&K�j=&KIuj>&}�(j<&K�j=&KOuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��int $limit = 10): array�j�]�u}�(j5&�$results�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$results = [];�j�]�u}�(j5&� $queryLower�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$queryLower = strtolower($query);�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&K�j=&K"uj>&}�(j<&K�j=&K*uuj@&}�(j:&}�(j<&K�j=&K"uj>&}�(j<&K�j=&K*uujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$chunkId => $chunk) {�j�]�u}�(j5&�$chunk�j7&K j8&}�(j:&}�(j<&K�j=&K.uj>&��}�(j<&K�j=&K4uuj@&}�(j:&}�(j<&K�j=&K.uj>&}�(j<&K�j=&K4uujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $chunk) {�j�]�u}�(j5&�$content�j7&K j8&}�(j:&}�(j<&K�j=&K uj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&K uj>&}�(j<&K�j=&Kuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��)$content = strtolower($chunk['content']);�j�]�u}�(j5&�$score�j7&K j8&}�(j:&}�(j<&K�j=&K uj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&K uj>&}�(j<&K�j=&Kuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��S$score = $this->calculateRelevanceScore($queryLower, $content, $chunk['metadata']);�j�]�u}�(j5&�$results�j7&K j8&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuuj@&}�(j:&}�(j<&K�j=&Kuj>&}�(j<&K�j=&Kuujji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$results[] = [�j�]�u}�(j5&�Closure�j7&K j8&}�(j:&}�(j<&Mj=&K uj>&}�(j<&Mj=&KNuuj@&}�(j:&}�(j<&Mj=&K uj>&}�(j<&Mj=&KNuujR&]�(}�(j5&�$a�j7&K j8&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuuj@&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuujj�(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��8array $a, array $b): int => $b['score'] <=> $a['score'],�j�]�u}�(j5&�$b�j7&K j8&}�(j:&}�(j<&Mj=&K!uj>&}�(j<&Mj=&K)uuj@&}�(j:&}�(j<&Mj=&K'uj>&}�(j<&Mj=&K)uujj�(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j )j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.array $b): int => $b['score'] <=> $a['score'],�j�]�uejji(j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��Cstatic fn (array $a, array $b): int => $b['score'] <=> $a['score'],�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jk(j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X</** * @param string $query * @param ?string $sdk * @param int $limit * * @throws RuntimeException * * @return array<array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>}> */ public function searchChunks(string $query, ?string $sdk = null, int $limit = 10): array { $this->ensureInitialized(); $results = []; $queryLower = strtolower($query); foreach ($this->chunks as $chunkId => $chunk) { if (null !== $sdk && $chunk['sdk'] !== strtolower($sdk)) { continue; } $content = strtolower($chunk['content']); $score = $this->calculateRelevanceScore($queryLower, $content, $chunk['metadata']); if (0 < $score) { $results[] = [ 'chunk_id' => $chunkId, 'sdk' => $chunk['sdk'], 'score' => $score, 'preview' => $this->generatePreview($chunk['content'], $query), 'metadata' => $chunk['metadata'], ]; } } usort( $results, /** * @param array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>} $a * @param array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>} $b */ static fn (array $a, array $b): int => $b['score'] <=> $a['score'], ); return array_slice($results, 0, $limit); }�u}�(j5&� buildIndex�j7&Kj8&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&M/j=&Kuuj@&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&KuujR&]�(}�(j5&�$sdkData�j7&K j8&}�(j:&}�(j<&Mj=&K!uj>&}�(j<&Mj=&K)uuj@&}�(j:&}�(j<&Mj=&K!uj>&}�(j<&Mj=&K)uujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j*)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $sdkData) {�j�]�u}�(j5&� $chunkIds�j7&K j8&}�(j:&}�(j<&M j=&K uj>&}�(j<&M j=&Kuuj@&}�(j:&}�(j<&M j=&K uj>&}�(j<&M j=&Kuujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j7)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$chunkIds = $sdkData['chunks'];�j�]�u}�(j5&�$counter�j7&K j8&}�(j:&}�(j<&M!j=&K uj>&}�(j<&M!j=&Kuuj@&}�(j:&}�(j<&M!j=&K uj>&}�(j<&M!j=&Kuujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jD)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$counter = count($chunkIds);�j�]�u}�(j5&�$i�j7&K j8&}�(j:&}�(j<&M#j=&Kuj>&}�(j<&M#j=&Kuuj@&}�(j:&}�(j<&M#j=&Kuj>&}�(j<&M#j=&Kuujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jQ)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$i = 0; $i < $counter; ++$i) {�j�]�u}�(j5&� $currentId�j7&K j8&}�(j:&}�(j<&M$j=&Kuj>&}�(j<&M$j=&Kuuj@&}�(j:&}�(j<&M$j=&Kuj>&}�(j<&M$j=&Kuujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j^)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentId = $chunkIds[$i];�j�]�u}�(j5&� $currentId�j7&K j8&}�(j:&}�(j<&M'j=&K"uj>&}�(j<&M'j=&K,uuj@&}�(j:&}�(j<&M'j=&K"uj>&}�(j<&M'j=&K,uujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jk)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentId]['prev_chunk'] = $chunkIds[$i - 1];�j�]�u}�(j5&� $currentId�j7&K j8&}�(j:&}�(j<&M+j=&K"uj>&}�(j<&M+j=&K,uuj@&}�(j:&}�(j<&M+j=&K"uj>&}�(j<&M+j=&K,uujj)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jx)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentId]['next_chunk'] = $chunkIds[$i + 1];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j!)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X(private function buildIndex(): void { // Build navigation links between chunks for each SDK foreach ($this->index as $sdkData) { if (! isset($sdkData['chunks'])) { continue; } if ([] === $sdkData['chunks']) { continue; } $chunkIds = $sdkData['chunks']; $counter = count($chunkIds); for ($i = 0; $i < $counter; ++$i) { $currentId = $chunkIds[$i]; if (0 < $i) { $this->chunks[$currentId]['prev_chunk'] = $chunkIds[$i - 1]; } if ($i < count($chunkIds) - 1) { $this->chunks[$currentId]['next_chunk'] = $chunkIds[$i + 1]; } } } }�u}�(j5&�calculateRelevanceScore�j7&Kj8&}�(j:&}�(j<&M1j=&Kuj>&}�(j<&MVj=&Kuuj@&}�(j:&}�(j<&M6j=&Kuj>&}�(j<&M6j=&K,uujR&]�(}�(j5&�$query�j7&K j8&}�(j:&}�(j<&M6j=&K-uj>&}�(j<&M6j=&K:uuj@&}�(j:&}�(j<&M6j=&K4uj>&}�(j<&M6j=&K:uujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��7string $query, string $content, array $metadata): float�j�]�u}�(j5&�$content�j7&K j8&}�(j:&}�(j<&M6j=&K<uj>&}�(j<&M6j=&KKuuj@&}�(j:&}�(j<&M6j=&KCuj>&}�(j<&M6j=&KKuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��(string $content, array $metadata): float�j�]�u}�(j5&� $metadata�j7&K j8&}�(j:&}�(j<&M6j=&KMuj>&}�(j<&M6j=&K\uuj@&}�(j:&}�(j<&M6j=&KSuj>&}�(j<&M6j=&K\uujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��array $metadata): float�j�]�u}�(j5&�$score�j7&K j8&}�(j:&}�(j<&M8j=&Kuj>&}�(j<&M8j=&Kuuj@&}�(j:&}�(j<&M8j=&Kuj>&}�(j<&M8j=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $score = 0.0;�j�]�u}�(j5&� $queryTerms�j7&K j8&}�(j:&}�(j<&M9j=&Kuj>&}�(j<&M9j=&Kuuj@&}�(j:&}�(j<&M9j=&Kuj>&}�(j<&M9j=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$queryTerms = explode(' ', $query);�j�]�u}�(j5&� $queryTerm�j7&K j8&}�(j:&}�(j<&M;j=&K uj>&}�(j<&M;j=&K*uuj@&}�(j:&}�(j<&M;j=&K uj>&}�(j<&M;j=&K*uujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $queryTerm) {�j�]�u}�(j5&� $termCount�j7&K j8&}�(j:&}�(j<&M<j=&K uj>&}�(j<&M<j=&Kuuj@&}�(j:&}�(j<&M<j=&K uj>&}�(j<&M<j=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��0$termCount = substr_count($content, $queryTerm);�j�]�u}�(j5&�$class�j7&K j8&}�(j:&}�(j<&M@j=&K uj>&}�(j<&M@j=&Kuuj@&}�(j:&}�(j<&M@j=&K uj>&}�(j<&M@j=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$class = $metadata['class'] ?? null;�j�]�u}�(j5&�$method�j7&K j8&}�(j:&}�(j<&MGj=&K uj>&}�(j<&MGj=&Kuuj@&}�(j:&}�(j<&MGj=&K uj>&}�(j<&MGj=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��&$method = $metadata['method'] ?? null;�j�]�u}�(j5&�$section�j7&K j8&}�(j:&}�(j<&MNj=&K uj>&}�(j<&MNj=&Kuuj@&}�(j:&}�(j<&MNj=&K uj>&}�(j<&MNj=&Kuujj�)j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��($section = $metadata['section'] ?? null;�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�)j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�/** * @param array<mixed> $metadata * @param string $query * @param string $content */ private function calculateRelevanceScore(string $query, string $content, array $metadata): float { $score = 0.0; $queryTerms = explode(' ', $query); foreach ($queryTerms as $queryTerm) { $termCount = substr_count($content, $queryTerm); $score += (float) $termCount * 1.0; /** @var mixed $class */ $class = $metadata['class'] ?? null; if (null !== $class && is_string($class) && false !== stripos($class, $queryTerm)) { $score += 5.0; } /** @var mixed $method */ $method = $metadata['method'] ?? null; if (null !== $method && is_string($method) && false !== stripos($method, $queryTerm)) { $score += 3.0; } /** @var mixed $section */ $section = $metadata['section'] ?? null; if (null !== $section && is_string($section) && false !== stripos($section, $queryTerm)) { $score += 2.0; } } return $score; }�u}�(j5&� createChunk�j7&Kj8&}�(j:&}�(j<&MXj=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M_j=&Kuj>&}�(j<&M_j=&K uujR&]�(}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M_j=&K!uj>&}�(j<&M_j=&K,uuj@&}�(j:&}�(j<&M_j=&K(uj>&}�(j<&M_j=&K,uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j!*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��Sstring $sdk, array $lines, ?string $section, ?string $class, ?string $method): void�j�]�u}�(j5&�$lines�j7&K j8&}�(j:&}�(j<&M_j=&K.uj>&}�(j<&M_j=&K:uuj@&}�(j:&}�(j<&M_j=&K4uj>&}�(j<&M_j=&K:uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j.*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��Farray $lines, ?string $section, ?string $class, ?string $method): void�j�]�u}�(j5&�$section�j7&K j8&}�(j:&}�(j<&M_j=&K<uj>&}�(j<&M_j=&KLuuj@&}�(j:&}�(j<&M_j=&KDuj>&}�(j<&M_j=&KLuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j;*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��8?string $section, ?string $class, ?string $method): void�j�]�u}�(j5&�$class�j7&K j8&}�(j:&}�(j<&M_j=&KNuj>&}�(j<&M_j=&K\uuj@&}�(j:&}�(j<&M_j=&KVuj>&}�(j<&M_j=&K\uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jH*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��&?string $class, ?string $method): void�j�]�u}�(j5&�$method�j7&K j8&}�(j:&}�(j<&M_j=&K^uj>&}�(j<&M_j=&Kmuuj@&}�(j:&}�(j<&M_j=&Kfuj>&}�(j<&M_j=&Kmuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jU*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��?string $method): void�j�]�u}�(j5&�$content�j7&K j8&}�(j:&}�(j<&Maj=&Kuj>&}�(j<&Maj=&Kuuj@&}�(j:&}�(j<&Maj=&Kuj>&}�(j<&Maj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jb*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$content = implode("\n", $lines);�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&Mbj=&Kuj>&}�(j<&Mbj=&Kuuj@&}�(j:&}�(j<&Mbj=&Kuj>&}�(j<&Mbj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jo*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��[$chunkId = $sdk . '_chunk_' . str_pad((string) count($this->chunks), 6, '0', STR_PAD_LEFT);�j�]�u}�(j5&� $metadata�j7&K j8&}�(j:&}�(j<&Mdj=&Kuj>&}�(j<&Mdj=&Kuuj@&}�(j:&}�(j<&Mdj=&Kuj>&}�(j<&Mdj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j|*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $metadata = [�j�]�u}�(j5&�$chunkId�j7&K j8&}�(j:&}�(j<&Mlj=&Kuj>&}�(j<&Mlj=&Kuuj@&}�(j:&}�(j<&Mlj=&Kuj>&}�(j<&Mlj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $chunkId] = [�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&Msj=&Kuj>&}�(j<&Msj=&Kuuj@&}�(j:&}�(j<&Msj=&Kuj>&}�(j<&Msj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$sdk]['chunks'][] = $chunkId;�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&Mvj=&Kuj>&}�(j<&Mvj=&Kuuj@&}�(j:&}�(j<&Mvj=&Kuj>&}�(j<&Mvj=&Kuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��3$sdk]['sections'][$section]['chunks'][] = $chunkId;�j�]�u}�(j5&�$section�j7&K j8&}�(j:&}�(j<&Mvj=&K+uj>&}�(j<&Mvj=&K3uuj@&}�(j:&}�(j<&Mvj=&K+uj>&}�(j<&Mvj=&K3uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$section]['chunks'][] = $chunkId;�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M{j=&Kuj>&}�(j<&M{j=&K!uuj@&}�(j:&}�(j<&M{j=&Kuj>&}�(j<&M{j=&K!uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��0$sdk]['classes'][$class]['chunk_id'] = $chunkId;�j�]�u}�(j5&�$class�j7&K j8&}�(j:&}�(j<&M{j=&K.uj>&}�(j<&M{j=&K4uuj@&}�(j:&}�(j<&M{j=&K.uj>&}�(j<&M{j=&K4uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$class]['chunk_id'] = $chunkId;�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&K!uuj@&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&K!uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��D$sdk]['classes'][$class]['methods'][$method]['chunk_id'] = $chunkId;�j�]�u}�(j5&�$class�j7&K j8&}�(j:&}�(j<&Mj=&K.uj>&}�(j<&Mj=&K4uuj@&}�(j:&}�(j<&Mj=&K.uj>&}�(j<&Mj=&K4uujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��3$class]['methods'][$method]['chunk_id'] = $chunkId;�j�]�u}�(j5&�$method�j7&K j8&}�(j:&}�(j<&Mj=&KAuj>&}�(j<&Mj=&KHuuj@&}�(j:&}�(j<&Mj=&KAuj>&}�(j<&Mj=&KHuujj*j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $method]['chunk_id'] = $chunkId;�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j*j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X/** * @param array<string> $lines * @param string $sdk * @param ?string $section * @param ?string $class * @param ?string $method */ private function createChunk(string $sdk, array $lines, ?string $section, ?string $class, ?string $method): void { $content = implode("\n", $lines); $chunkId = $sdk . '_chunk_' . str_pad((string) count($this->chunks), 6, '0', STR_PAD_LEFT); $metadata = [ 'section' => $section, 'class' => $class, 'method' => $method, 'line_count' => count($lines), 'size_bytes' => strlen($content), ]; $this->chunks[$chunkId] = [ 'id' => $chunkId, 'sdk' => $sdk, 'content' => $content, 'metadata' => $metadata, ]; $this->index[$sdk]['chunks'][] = $chunkId; if (null !== $section && isset($this->index[$sdk]['sections'][$section])) { $this->index[$sdk]['sections'][$section]['chunks'][] = $chunkId; } if (null !== $class && isset($this->index[$sdk]['classes'][$class])) { if (null === $this->index[$sdk]['classes'][$class]['chunk_id']) { $this->index[$sdk]['classes'][$class]['chunk_id'] = $chunkId; } if (null !== $method && isset($this->index[$sdk]['classes'][$class]['methods'][$method])) { $this->index[$sdk]['classes'][$class]['methods'][$method]['chunk_id'] = $chunkId; } } }�u}�(j5&�ensureInitialized�j7&Kj8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K&uujjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj���/** * @throws RuntimeException */ private function ensureInitialized(): void { if (! $this->initialized) { $this->initialize(); } }�j�]�u}�(j5&�extractClassNameFromSource�j7&Kj8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K/uujR&]�}�(j5&� $sourceFile�j7&K j8&}�(j:&}�(j<&M�j=&K0uj>&}�(j<&M�j=&KBuuj@&}�(j:&}�(j<&M�j=&K7uj>&}�(j<&M�j=&KBuujj +j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $sourceFile): ?string�j�]�uajjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�private function extractClassNameFromSource(string $sourceFile): ?string { if (1 === preg_match('/\/([^\/]+)\.(php|go|py|java|cs|js|ts)$/', $sourceFile, $matches)) { // When preg_match returns 1, capturing groups are guaranteed to be set /** @var array{0: non-falsy-string, 1: non-empty-string, 2: non-empty-string} $matches */ return $matches[1]; } return null; }�u}�(j5&�generatePreview�j7&Kj8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K$uujR&]�(}�(j5&�$content�j7&K j8&}�(j:&}�(j<&M�j=&K%uj>&}�(j<&M�j=&K4uuj@&}�(j:&}�(j<&M�j=&K,uj>&}�(j<&M�j=&K4uujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j2+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��Astring $content, string $query, int $previewLength = 200): string�j�]�u}�(j5&�$query�j7&K j8&}�(j:&}�(j<&M�j=&K6uj>&}�(j<&M�j=&KCuuj@&}�(j:&}�(j<&M�j=&K=uj>&}�(j<&M�j=&KCuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j?+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��0string $query, int $previewLength = 200): string�j�]�u}�(j5&�$previewLength�j7&K j8&}�(j:&}�(j<&M�j=&KEuj>&}�(j<&M�j=&K]uuj@&}�(j:&}�(j<&M�j=&KIuj>&}�(j<&M�j=&KWuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jL+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!int $previewLength = 200): string�j�]�u}�(j5&� $queryLower�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jY+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$queryLower = strtolower($query);�j�]�u}�(j5&� $contentLower�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jf+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��%$contentLower = strtolower($content);�j�]�u}�(j5&� $position�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�js+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��/$position = strpos($contentLower, $queryLower);�j�]�u}�(j5&� $queryTerms�j7&K j8&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��($queryTerms = explode(' ', $queryLower);�j�]�u}�(j5&� $queryTerm�j7&K j8&}�(j:&}�(j<&M�j=&K$uj>&}�(j<&M�j=&K.uuj@&}�(j:&}�(j<&M�j=&K$uj>&}�(j<&M�j=&K.uujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $queryTerm) {�j�]�u}�(j5&� $position�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$position = strpos($contentLower, $queryTerm);�j�]�u}�(j5&� $position�j7&K j8&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$position = 0;�j�]�u}�(j5&�$start�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $start = max(0, $position - 50);�j�]�u}�(j5&�$end�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��9$end = min(strlen($content), $position + $previewLength);�j�]�u}�(j5&�$preview�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��3$preview = substr($content, $start, $end - $start);�j�]�u}�(j5&�$preview�j7&K j8&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuujj'+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$preview = '...' . ltrim($preview);�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j)+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�private function generatePreview(string $content, string $query, int $previewLength = 200): string { $queryLower = strtolower($query); $contentLower = strtolower($content); $position = strpos($contentLower, $queryLower); if (false === $position) { $queryTerms = explode(' ', $queryLower); foreach ($queryTerms as $queryTerm) { $position = strpos($contentLower, $queryTerm); if (false !== $position) { break; } } } if (false === $position) { $position = 0; } $start = max(0, $position - 50); $end = min(strlen($content), $position + $previewLength); $preview = substr($content, $start, $end - $start); if (0 < $start) { $preview = '...' . ltrim($preview); } if ($end < strlen($content)) { return rtrim($preview) . '...'; } return $preview; }�u}�(j5&�parseDocumentationFile�j7&Kj8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M,j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K+uujR&]�(}�(j5&�$file�j7&K j8&}�(j:&}�(j<&M�j=&K,uj>&}�(j<&M�j=&K8uuj@&}�(j:&}�(j<&M�j=&K3uj>&}�(j<&M�j=&K8uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� string $file, string $sdk): void�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M�j=&K:uj>&}�(j<&M�j=&KEuuj@&}�(j:&}�(j<&M�j=&KAuj>&}�(j<&M�j=&KEuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $sdk): void�j�]�u}�(j5&�$content�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$content = file_get_contents($file);�j�]�u}�(j5&�$lines�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$lines = explode("\n", $content);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j),j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentSection = null;�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j6,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentClass = null;�j�]�u}�(j5&�$currentMethod�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jC,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentMethod = null;�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jP,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&� $lineNumber�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j],j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$lineNumber = 0;�j�]�u}�(j5&�$inSourceBlock�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jj,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$inSourceBlock = false;�j�]�u}�(j5&�$line�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jw,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$line) {�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K!uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K!uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$sdk]['source'] = trim($matches[1]);�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K!uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K!uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��'$sdk]['generated'] = trim($matches[1]);�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&�$inSourceBlock�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$inSourceBlock = true;�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��E$currentClass = $this->extractClassNameFromSource(trim($matches[1]));�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&�$inSourceBlock�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$inSourceBlock = false;�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentClass = null;�j�]�u}�(j5&�$currentMethod�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentMethod = null;�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�,j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$currentSection = trim($matches[1]);�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M�j=&K!uj>&}�(j<&M�j=&K%uuj@&}�(j:&}�(j<&M�j=&K!uj>&}�(j<&M�j=&K%uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��&$sdk]['sections'][$currentSection] = [�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M�j=&K3uj>&}�(j<&M�j=&KBuuj@&}�(j:&}�(j<&M�j=&K3uj>&}�(j<&M�j=&KBuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j -j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentSection] = [�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuuj@&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j--j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��"$currentClass = trim($matches[1]);�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&M j=&K!uj>&}�(j<&M j=&K%uuj@&}�(j:&}�(j<&M j=&K!uj>&}�(j<&M j=&K%uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j:-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$sdk]['classes'][$currentClass] = [�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&M j=&K2uj>&}�(j<&M j=&K?uuj@&}�(j:&}�(j<&M j=&K2uj>&}�(j<&M j=&K?uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentClass] = [�j�]�u}�(j5&�$currentMethod�j7&K j8&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuuj@&}�(j:&}�(j<&Mj=&Kuj>&}�(j<&Mj=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jT-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$currentMethod = trim($matches[1]);�j�]�u}�(j5&�$sdk�j7&K j8&}�(j:&}�(j<&Mj=&K!uj>&}�(j<&Mj=&K%uuj@&}�(j:&}�(j<&Mj=&K!uj>&}�(j<&Mj=&K%uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�ja-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��>$sdk]['classes'][$currentClass]['methods'][$currentMethod] = [�j�]�u}�(j5&� $currentClass�j7&K j8&}�(j:&}�(j<&Mj=&K2uj>&}�(j<&Mj=&K?uuj@&}�(j:&}�(j<&Mj=&K2uj>&}�(j<&Mj=&K?uujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jn-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��-$currentClass]['methods'][$currentMethod] = [�j�]�u}�(j5&�$currentMethod�j7&K j8&}�(j:&}�(j<&Mj=&KLuj>&}�(j<&Mj=&KZuuj@&}�(j:&}�(j<&Mj=&KLuj>&}�(j<&Mj=&KZuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j{-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentMethod] = [�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M!j=&K uj>&}�(j<&M!j=&Kuuj@&}�(j:&}�(j<&M!j=&K uj>&}�(j<&M!j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$buffer[] = $line;�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M%j=&Kuj>&}�(j<&M%j=&Kuuj@&}�(j:&}�(j<&M%j=&Kuj>&}�(j<&M%j=&Kuujj�+j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�+j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�private function parseDocumentationFile(string $file, string $sdk): void { $content = file_get_contents($file); if (false === $content) { return; } $lines = explode("\n", $content); $currentSection = null; $currentClass = null; $currentMethod = null; $buffer = []; $lineNumber = 0; $inSourceBlock = false; foreach ($lines as $line) { ++$lineNumber; if (1 === preg_match('/^> Compiled from: (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $this->index[$sdk]['source'] = trim($matches[1]); } if (1 === preg_match('/^> Generated: (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $this->index[$sdk]['generated'] = trim($matches[1]); } if (1 === preg_match('/^<!-- Source: (.+) -->$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } $inSourceBlock = true; /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentClass = $this->extractClassNameFromSource(trim($matches[1])); continue; } if (1 === preg_match('/^<!-- End of .+ -->$/', $line)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } $inSourceBlock = false; $currentClass = null; $currentMethod = null; continue; } if (1 === preg_match('/^## (.+)$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentSection = trim($matches[1]); if (! isset($this->index[$sdk]['sections'][$currentSection])) { $this->index[$sdk]['sections'][$currentSection] = [ 'line_start' => $lineNumber, 'chunks' => [], ]; } } if (1 === preg_match('/^### (.+)$/', $line, $matches) && $inSourceBlock) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentClass = trim($matches[1]); if (! isset($this->index[$sdk]['classes'][$currentClass])) { $this->index[$sdk]['classes'][$currentClass] = [ 'namespace' => null, 'methods' => [], 'chunk_id' => null, ]; } } if (null !== $currentClass && 1 === preg_match('/^##### (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentMethod = trim($matches[1]); if (! isset($this->index[$sdk]['classes'][$currentClass]['methods'][$currentMethod])) { $this->index[$sdk]['classes'][$currentClass]['methods'][$currentMethod] = [ 'signature' => null, 'parameters' => [], 'returns' => null, 'chunk_id' => null, ]; } } $buffer[] = $line; if (self::CHUNK_SIZE_LIMIT <= count($buffer)) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } } if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); } }�u}�(j5&�parseGeneralDocumentation�j7&Kj8&}�(j:&}�(j<&M.j=&Kuj>&}�(j<&Myj=&Kuuj@&}�(j:&}�(j<&M.j=&Kuj>&}�(j<&M.j=&K.uujR&]�(}�(j5&�$file�j7&K j8&}�(j:&}�(j<&M.j=&K/uj>&}�(j<&M.j=&K;uuj@&}�(j:&}�(j<&M.j=&K6uj>&}�(j<&M.j=&K;uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� string $file, string $key): void�j�]�u}�(j5&�$key�j7&K j8&}�(j:&}�(j<&M.j=&K=uj>&}�(j<&M.j=&KHuuj@&}�(j:&}�(j<&M.j=&KDuj>&}�(j<&M.j=&KHuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��string $key): void�j�]�u}�(j5&�$content�j7&K j8&}�(j:&}�(j<&M0j=&Kuj>&}�(j<&M0j=&Kuuj@&}�(j:&}�(j<&M0j=&Kuj>&}�(j<&M0j=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$content = file_get_contents($file);�j�]�u}�(j5&�$lines�j7&K j8&}�(j:&}�(j<&M6j=&Kuj>&}�(j<&M6j=&Kuuj@&}�(j:&}�(j<&M6j=&Kuj>&}�(j<&M6j=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��!$lines = explode("\n", $content);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M7j=&Kuj>&}�(j<&M7j=&Kuuj@&}�(j:&}�(j<&M7j=&Kuj>&}�(j<&M7j=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentSection = null;�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&M8j=&Kuj>&}�(j<&M8j=&Kuuj@&}�(j:&}�(j<&M8j=&Kuj>&}�(j<&M8j=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&� $lineNumber�j7&K j8&}�(j:&}�(j<&M9j=&Kuj>&}�(j<&M9j=&Kuuj@&}�(j:&}�(j<&M9j=&Kuj>&}�(j<&M9j=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$lineNumber = 0;�j�]�u}�(j5&�$line�j7&K j8&}�(j:&}�(j<&M;j=&Kuj>&}�(j<&M;j=&K uuj@&}�(j:&}�(j<&M;j=&Kuj>&}�(j<&M;j=&K uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j .j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$line) {�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&MBj=&Kuj>&}�(j<&MBj=&Kuuj@&}�(j:&}�(j<&MBj=&Kuj>&}�(j<&MBj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MFj=&Kuj>&}�(j<&MFj=&Kuuj@&}�(j:&}�(j<&MFj=&Kuj>&}�(j<&MFj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j$.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$currentSection = trim($matches[2]);�j�]�u}�(j5&�$cleaned�j7&K j8&}�(j:&}�(j<&MJj=&Kuj>&}�(j<&MJj=&Kuuj@&}�(j:&}�(j<&MJj=&Kuj>&}�(j<&MJj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j1.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��N$cleaned = preg_replace('/<ProductName[^>]*\/>/', 'OpenFGA', $currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MKj=&Kuj>&}�(j<&MKj=&Kuuj@&}�(j:&}�(j<&MKj=&Kuj>&}�(j<&MKj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j>.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentSection = $cleaned ?? $currentSection;�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MNj=&Kuj>&}�(j<&MNj=&Kuuj@&}�(j:&}�(j<&MNj=&Kuj>&}�(j<&MNj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jK.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentSection = strip_tags($currentSection);�j�]�u}�(j5&�$cleaned�j7&K j8&}�(j:&}�(j<&MPj=&Kuj>&}�(j<&MPj=&Kuuj@&}�(j:&}�(j<&MPj=&Kuj>&}�(j<&MPj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jX.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��C$cleaned = preg_replace('/\s*\{[^}]*\}\s*/', ' ', $currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MQj=&Kuj>&}�(j<&MQj=&Kuuj@&}�(j:&}�(j<&MQj=&Kuj>&}�(j<&MQj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�je.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentSection = $cleaned ?? $currentSection;�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MSj=&Kuj>&}�(j<&MSj=&Kuuj@&}�(j:&}�(j<&MSj=&Kuj>&}�(j<&MSj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jr.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��?$currentSection = str_replace(['<', '>'], '', $currentSection);�j�]�u}�(j5&�$cleaned�j7&K j8&}�(j:&}�(j<&MUj=&Kuj>&}�(j<&MUj=&Kuuj@&}�(j:&}�(j<&MUj=&Kuj>&}�(j<&MUj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��7$cleaned = preg_replace('/\s+/', ' ', $currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MVj=&Kuj>&}�(j<&MVj=&Kuuj@&}�(j:&}�(j<&MVj=&Kuj>&}�(j<&MVj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��.$currentSection = $cleaned ?? $currentSection;�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&MWj=&Kuj>&}�(j<&MWj=&Kuuj@&}�(j:&}�(j<&MWj=&Kuj>&}�(j<&MWj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��($currentSection = trim($currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M[j=&Kuj>&}�(j<&M[j=&K#uuj@&}�(j:&}�(j<&M[j=&Kuj>&}�(j<&M[j=&K#uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$$currentSection = trim($matches[2]);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M]j=&Kuj>&}�(j<&M]j=&K#uuj@&}�(j:&}�(j<&M]j=&Kuj>&}�(j<&M]j=&K#uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��N$currentSection = str_replace(['<', '>', '{', '}', '/'], '', $currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&M^j=&Kuj>&}�(j<&M^j=&K#uuj@&}�(j:&}�(j<&M^j=&Kuj>&}�(j<&M^j=&K#uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��($currentSection = trim($currentSection);�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&Mbj=&Kuj>&}�(j<&Mbj=&K'uuj@&}�(j:&}�(j<&Mbj=&Kuj>&}�(j<&Mbj=&K'uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��+$currentSection = 'Section ' . $lineNumber;�j�]�u}�(j5&�$key�j7&K j8&}�(j:&}�(j<&Mgj=&K!uj>&}�(j<&Mgj=&K%uuj@&}�(j:&}�(j<&Mgj=&K!uj>&}�(j<&Mgj=&K%uujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��&$key]['sections'][$currentSection] = [�j�]�u}�(j5&�$currentSection�j7&K j8&}�(j:&}�(j<&Mgj=&K3uj>&}�(j<&Mgj=&KBuuj@&}�(j:&}�(j<&Mgj=&K3uj>&}�(j<&Mgj=&KBuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$currentSection] = [�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&Mnj=&K uj>&}�(j<&Mnj=&Kuuj@&}�(j:&}�(j<&Mnj=&K uj>&}�(j<&Mnj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�.j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$buffer[] = $line;�j�]�u}�(j5&�$buffer�j7&K j8&}�(j:&}�(j<&Mrj=&Kuj>&}�(j<&Mrj=&Kuuj@&}�(j:&}�(j<&Mrj=&Kuj>&}�(j<&Mrj=&Kuujj�-j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $buffer = [];�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j�-j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�XU private function parseGeneralDocumentation(string $file, string $key): void { $content = file_get_contents($file); if (false === $content) { return; } $lines = explode("\n", $content); $currentSection = null; $buffer = []; $lineNumber = 0; foreach ($lines as $line) { ++$lineNumber; // Match both ## and ### headers for sections (but not #### or deeper) if (1 === preg_match('/^(##|###) (.+)$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($key, $buffer, $currentSection, null, null); $buffer = []; } /** @var array{0: non-falsy-string, 1: '###'|'##', 2: non-empty-string} $matches */ $currentSection = trim($matches[2]); // Handle JSX components more carefully // Replace <ProductName .../> with "OpenFGA" $cleaned = preg_replace('/<ProductName[^>]*\/>/', 'OpenFGA', $currentSection); $currentSection = $cleaned ?? $currentSection; // Clean up any remaining markdown/JSX formatting $currentSection = strip_tags($currentSection); // Remove JSX attributes like format={...} $cleaned = preg_replace('/\s*\{[^}]*\}\s*/', ' ', $currentSection); $currentSection = $cleaned ?? $currentSection; // Clean up any remaining < or > characters $currentSection = str_replace(['<', '>'], '', $currentSection); // Clean up multiple spaces $cleaned = preg_replace('/\s+/', ' ', $currentSection); $currentSection = $cleaned ?? $currentSection; $currentSection = trim($currentSection); // If section name is empty after cleaning, use the original with basic cleanup if ('' === trim($currentSection)) { $currentSection = trim($matches[2]); // Just remove the most problematic characters $currentSection = str_replace(['<', '>', '{', '}', '/'], '', $currentSection); $currentSection = trim($currentSection); // If still empty, use a placeholder if ('' === trim($currentSection)) { $currentSection = 'Section ' . $lineNumber; } } if (! isset($this->index[$key]['sections'][$currentSection])) { $this->index[$key]['sections'][$currentSection] = [ 'line_start' => $lineNumber, 'chunks' => [], ]; } } $buffer[] = $line; if (self::CHUNK_SIZE_LIMIT <= count($buffer)) { $this->createChunk($key, $buffer, $currentSection, null, null); $buffer = []; } } if ([] !== $buffer) { $this->createChunk($key, $buffer, $currentSection, null, null); } }�u�r}�(j5&�scanDocumentationFiles�j7&Kj8&}�(j:&}�(j<&M{j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M~j=&Kuj>&}�(j<&M~j=&K+uujR&]�(}�(j5&�$files�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj/j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��)$files = glob(self::DOCS_PATH . '/*.md');�j�]�u}�(j5&�$file�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K uujj/j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j(/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$file) {�j�]�u}�(j5&� $filename�j7&K j8&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&K uj>&}�(j<&M�j=&Kuujj/j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j5/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��$filename = basename($file);�j�]�u}�(j5&�$sdkName�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&Kuujj/j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jB/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj��#$sdkName = strtolower($matches[1]);�j�]�u}�(j5&�$sdkName�j7&K j8&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K%uuj@&}�(j:&}�(j<&M�j=&Kuj>&}�(j<&M�j=&K%uujj/j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jO/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�� $sdkName] = [�j�]�uejjJ&j�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�j/j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�Xo/** * @throws RuntimeException */ private function scanDocumentationFiles(): void { if (! is_dir(self::DOCS_PATH)) { throw new RuntimeException('Documentation directory not found: ' . self::DOCS_PATH); } $files = glob(self::DOCS_PATH . '/*.md'); if (false === $files) { throw new RuntimeException('Failed to scan documentation directory'); } foreach ($files as $file) { $filename = basename($file); if (1 === preg_match('/^([A-Z]+)_SDK\.md$/', $filename, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $sdkName = strtolower($matches[1]); $this->sdkList[] = $sdkName; $this->index[$sdkName] = [ 'name' => $matches[1] . ' SDK', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseDocumentationFile($file, $sdkName); } elseif ('AUTHORING_OPENFGA_MODELS.md' === $filename) { $this->index['authoring'] = [ 'name' => 'Model Authoring Guide', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseGeneralDocumentation($file, 'authoring'); } elseif ('OPENFGA_DOCS.md' === $filename) { $this->index['general'] = [ 'name' => 'OpenFGA Documentation', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseGeneralDocumentation($file, 'general'); } } }�uej�}�(j��Zfile:///Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jL&j��S/Users/evan/Developer/evansims/openfga-mcp/src/Documentation/DocumentationIndex.php�j�jG&uj�X�[final class DocumentationIndex { private const int CHUNK_SIZE_LIMIT = 5000; private const string DOCS_PATH = __DIR__ . '/../../docs'; /** * @var array<string, array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}> */ private array $chunks = []; /** * @var array<string, array{name: string, file: string, sections: array<string, array{line_start: int, chunks: array<string>}>, classes: array<string, array{namespace: string|null, methods: array<string, array{signature: string|null, parameters: array<mixed>, returns: string|null, chunk_id: string|null}>, chunk_id: string|null}>, chunks: array<string>, source: string|null, generated: string|null}> */ private array $index = []; private bool $initialized = false; /** * @var array<string> */ private array $sdkList = []; /** * @param string $chunkId * * @throws RuntimeException * * @return array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}|null */ public function getChunk(string $chunkId): ?array { $this->ensureInitialized(); return $this->chunks[$chunkId] ?? null; } /** * Get a specific chunk by its ID. * * @param string $chunkId * @return array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}|null */ public function getChunkById(string $chunkId): ?array { return $this->chunks[$chunkId] ?? null; } /** * @param string $sdk * @param string $section * * @throws RuntimeException * * @return array<array{id: string, sdk: string, content: string, metadata: array{section: string|null, class: string|null, method: string|null, line_count: int, size_bytes: int}, prev_chunk?: string, next_chunk?: string}> */ public function getChunksBySection(string $sdk, string $section): array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey]['sections'][$section])) { return []; } $sectionData = $this->index[$sdkKey]['sections'][$section] ?? null; if (null === $sectionData) { return []; } $chunkIds = $sectionData['chunks']; $chunks = []; foreach ($chunkIds as $chunkId) { if (isset($this->chunks[$chunkId])) { $chunks[] = $this->chunks[$chunkId]; } } return $chunks; } /** * @param string $sdk * @param string $className * * @throws RuntimeException * * @return array{class: string, sdk: string, namespace: string|null, methods: array<string, array{signature: string|null, parameters: array<mixed>, returns: string|null, chunk_id: string|null}>, content: string, metadata: array<mixed>}|null */ public function getClassDocumentation(string $sdk, string $className): ?array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey]['classes'][$className])) { return null; } $classInfo = $this->index[$sdkKey]['classes'][$className]; $chunkId = $classInfo['chunk_id']; if (null === $chunkId || ! isset($this->chunks[$chunkId])) { return null; } $chunk = $this->chunks[$chunkId]; return [ 'class' => $className, 'sdk' => $sdkKey, 'namespace' => $classInfo['namespace'], 'methods' => $classInfo['methods'], 'content' => $chunk['content'], 'metadata' => $chunk['metadata'], ]; } /** * @param string $sdk * @param string $className * @param string $methodName * * @throws RuntimeException * * @return array{method: string, class: string, sdk: string, signature: string|null, parameters: array<mixed>, returns: string|null, content: string}|null */ public function getMethodDocumentation(string $sdk, string $className, string $methodName): ?array { $this->ensureInitialized(); $classDoc = $this->getClassDocumentation($sdk, $className); if (null === $classDoc || ! isset($classDoc['methods'][$methodName])) { return null; } $methodInfo = $classDoc['methods'][$methodName]; $chunkId = $methodInfo['chunk_id']; if (null === $chunkId || ! isset($this->chunks[$chunkId])) { return null; } $chunk = $this->chunks[$chunkId]; return [ 'method' => $methodName, 'class' => $className, 'sdk' => $sdk, 'signature' => $methodInfo['signature'], 'parameters' => $methodInfo['parameters'], 'returns' => $methodInfo['returns'], 'content' => $chunk['content'], ]; } /** * @throws RuntimeException * * @return array<string> */ public function getSdkList(): array { $this->ensureInitialized(); return $this->sdkList; } /** * @param string $sdk * * @throws RuntimeException * * @return array{sdk: string, name: string, file: string, sections: array<string>, classes: array<string>, total_chunks: int, source: string|null, generated: string|null}|null */ public function getSdkOverview(string $sdk): ?array { $this->ensureInitialized(); $sdkKey = strtolower($sdk); if (! isset($this->index[$sdkKey])) { return null; } $sdkData = $this->index[$sdkKey]; return [ 'sdk' => $sdkKey, 'name' => $sdkData['name'], 'file' => $sdkData['file'], 'sections' => array_keys($sdkData['sections'] ?? []), 'classes' => array_keys($sdkData['classes'] ?? []), 'total_chunks' => count($sdkData['chunks'] ?? []), 'source' => $sdkData['source'] ?? null, 'generated' => $sdkData['generated'] ?? null, ]; } /** * @throws RuntimeException */ public function initialize(): void { if ($this->initialized) { return; } $this->scanDocumentationFiles(); $this->buildIndex(); $this->initialized = true; } public function isInitialized(): bool { return $this->initialized; } /** * @param string $query * @param ?string $sdk * @param int $limit * * @throws RuntimeException * * @return array<array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>}> */ public function searchChunks(string $query, ?string $sdk = null, int $limit = 10): array { $this->ensureInitialized(); $results = []; $queryLower = strtolower($query); foreach ($this->chunks as $chunkId => $chunk) { if (null !== $sdk && $chunk['sdk'] !== strtolower($sdk)) { continue; } $content = strtolower($chunk['content']); $score = $this->calculateRelevanceScore($queryLower, $content, $chunk['metadata']); if (0 < $score) { $results[] = [ 'chunk_id' => $chunkId, 'sdk' => $chunk['sdk'], 'score' => $score, 'preview' => $this->generatePreview($chunk['content'], $query), 'metadata' => $chunk['metadata'], ]; } } usort( $results, /** * @param array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>} $a * @param array{chunk_id: string, sdk: string, score: float, preview: string, metadata: array<mixed>} $b */ static fn (array $a, array $b): int => $b['score'] <=> $a['score'], ); return array_slice($results, 0, $limit); } private function buildIndex(): void { // Build navigation links between chunks for each SDK foreach ($this->index as $sdkData) { if (! isset($sdkData['chunks'])) { continue; } if ([] === $sdkData['chunks']) { continue; } $chunkIds = $sdkData['chunks']; $counter = count($chunkIds); for ($i = 0; $i < $counter; ++$i) { $currentId = $chunkIds[$i]; if (0 < $i) { $this->chunks[$currentId]['prev_chunk'] = $chunkIds[$i - 1]; } if ($i < count($chunkIds) - 1) { $this->chunks[$currentId]['next_chunk'] = $chunkIds[$i + 1]; } } } } /** * @param array<mixed> $metadata * @param string $query * @param string $content */ private function calculateRelevanceScore(string $query, string $content, array $metadata): float { $score = 0.0; $queryTerms = explode(' ', $query); foreach ($queryTerms as $queryTerm) { $termCount = substr_count($content, $queryTerm); $score += (float) $termCount * 1.0; /** @var mixed $class */ $class = $metadata['class'] ?? null; if (null !== $class && is_string($class) && false !== stripos($class, $queryTerm)) { $score += 5.0; } /** @var mixed $method */ $method = $metadata['method'] ?? null; if (null !== $method && is_string($method) && false !== stripos($method, $queryTerm)) { $score += 3.0; } /** @var mixed $section */ $section = $metadata['section'] ?? null; if (null !== $section && is_string($section) && false !== stripos($section, $queryTerm)) { $score += 2.0; } } return $score; } /** * @param array<string> $lines * @param string $sdk * @param ?string $section * @param ?string $class * @param ?string $method */ private function createChunk(string $sdk, array $lines, ?string $section, ?string $class, ?string $method): void { $content = implode("\n", $lines); $chunkId = $sdk . '_chunk_' . str_pad((string) count($this->chunks), 6, '0', STR_PAD_LEFT); $metadata = [ 'section' => $section, 'class' => $class, 'method' => $method, 'line_count' => count($lines), 'size_bytes' => strlen($content), ]; $this->chunks[$chunkId] = [ 'id' => $chunkId, 'sdk' => $sdk, 'content' => $content, 'metadata' => $metadata, ]; $this->index[$sdk]['chunks'][] = $chunkId; if (null !== $section && isset($this->index[$sdk]['sections'][$section])) { $this->index[$sdk]['sections'][$section]['chunks'][] = $chunkId; } if (null !== $class && isset($this->index[$sdk]['classes'][$class])) { if (null === $this->index[$sdk]['classes'][$class]['chunk_id']) { $this->index[$sdk]['classes'][$class]['chunk_id'] = $chunkId; } if (null !== $method && isset($this->index[$sdk]['classes'][$class]['methods'][$method])) { $this->index[$sdk]['classes'][$class]['methods'][$method]['chunk_id'] = $chunkId; } } } /** * @throws RuntimeException */ private function ensureInitialized(): void { if (! $this->initialized) { $this->initialize(); } } private function extractClassNameFromSource(string $sourceFile): ?string { if (1 === preg_match('/\/([^\/]+)\.(php|go|py|java|cs|js|ts)$/', $sourceFile, $matches)) { // When preg_match returns 1, capturing groups are guaranteed to be set /** @var array{0: non-falsy-string, 1: non-empty-string, 2: non-empty-string} $matches */ return $matches[1]; } return null; } private function generatePreview(string $content, string $query, int $previewLength = 200): string { $queryLower = strtolower($query); $contentLower = strtolower($content); $position = strpos($contentLower, $queryLower); if (false === $position) { $queryTerms = explode(' ', $queryLower); foreach ($queryTerms as $queryTerm) { $position = strpos($contentLower, $queryTerm); if (false !== $position) { break; } } } if (false === $position) { $position = 0; } $start = max(0, $position - 50); $end = min(strlen($content), $position + $previewLength); $preview = substr($content, $start, $end - $start); if (0 < $start) { $preview = '...' . ltrim($preview); } if ($end < strlen($content)) { return rtrim($preview) . '...'; } return $preview; } private function parseDocumentationFile(string $file, string $sdk): void { $content = file_get_contents($file); if (false === $content) { return; } $lines = explode("\n", $content); $currentSection = null; $currentClass = null; $currentMethod = null; $buffer = []; $lineNumber = 0; $inSourceBlock = false; foreach ($lines as $line) { ++$lineNumber; if (1 === preg_match('/^> Compiled from: (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $this->index[$sdk]['source'] = trim($matches[1]); } if (1 === preg_match('/^> Generated: (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $this->index[$sdk]['generated'] = trim($matches[1]); } if (1 === preg_match('/^<!-- Source: (.+) -->$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } $inSourceBlock = true; /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentClass = $this->extractClassNameFromSource(trim($matches[1])); continue; } if (1 === preg_match('/^<!-- End of .+ -->$/', $line)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } $inSourceBlock = false; $currentClass = null; $currentMethod = null; continue; } if (1 === preg_match('/^## (.+)$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentSection = trim($matches[1]); if (! isset($this->index[$sdk]['sections'][$currentSection])) { $this->index[$sdk]['sections'][$currentSection] = [ 'line_start' => $lineNumber, 'chunks' => [], ]; } } if (1 === preg_match('/^### (.+)$/', $line, $matches) && $inSourceBlock) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentClass = trim($matches[1]); if (! isset($this->index[$sdk]['classes'][$currentClass])) { $this->index[$sdk]['classes'][$currentClass] = [ 'namespace' => null, 'methods' => [], 'chunk_id' => null, ]; } } if (null !== $currentClass && 1 === preg_match('/^##### (.+)$/', $line, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $currentMethod = trim($matches[1]); if (! isset($this->index[$sdk]['classes'][$currentClass]['methods'][$currentMethod])) { $this->index[$sdk]['classes'][$currentClass]['methods'][$currentMethod] = [ 'signature' => null, 'parameters' => [], 'returns' => null, 'chunk_id' => null, ]; } } $buffer[] = $line; if (self::CHUNK_SIZE_LIMIT <= count($buffer)) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); $buffer = []; } } if ([] !== $buffer) { $this->createChunk($sdk, $buffer, $currentSection, $currentClass, $currentMethod); } } private function parseGeneralDocumentation(string $file, string $key): void { $content = file_get_contents($file); if (false === $content) { return; } $lines = explode("\n", $content); $currentSection = null; $buffer = []; $lineNumber = 0; foreach ($lines as $line) { ++$lineNumber; // Match both ## and ### headers for sections (but not #### or deeper) if (1 === preg_match('/^(##|###) (.+)$/', $line, $matches)) { if ([] !== $buffer) { $this->createChunk($key, $buffer, $currentSection, null, null); $buffer = []; } /** @var array{0: non-falsy-string, 1: '###'|'##', 2: non-empty-string} $matches */ $currentSection = trim($matches[2]); // Handle JSX components more carefully // Replace <ProductName .../> with "OpenFGA" $cleaned = preg_replace('/<ProductName[^>]*\/>/', 'OpenFGA', $currentSection); $currentSection = $cleaned ?? $currentSection; // Clean up any remaining markdown/JSX formatting $currentSection = strip_tags($currentSection); // Remove JSX attributes like format={...} $cleaned = preg_replace('/\s*\{[^}]*\}\s*/', ' ', $currentSection); $currentSection = $cleaned ?? $currentSection; // Clean up any remaining < or > characters $currentSection = str_replace(['<', '>'], '', $currentSection); // Clean up multiple spaces $cleaned = preg_replace('/\s+/', ' ', $currentSection); $currentSection = $cleaned ?? $currentSection; $currentSection = trim($currentSection); // If section name is empty after cleaning, use the original with basic cleanup if ('' === trim($currentSection)) { $currentSection = trim($matches[2]); // Just remove the most problematic characters $currentSection = str_replace(['<', '>', '{', '}', '/'], '', $currentSection); $currentSection = trim($currentSection); // If still empty, use a placeholder if ('' === trim($currentSection)) { $currentSection = 'Section ' . $lineNumber; } } if (! isset($this->index[$key]['sections'][$currentSection])) { $this->index[$key]['sections'][$currentSection] = [ 'line_start' => $lineNumber, 'chunks' => [], ]; } } $buffer[] = $line; if (self::CHUNK_SIZE_LIMIT <= count($buffer)) { $this->createChunk($key, $buffer, $currentSection, null, null); $buffer = []; } } if ([] !== $buffer) { $this->createChunk($key, $buffer, $currentSection, null, null); } } /** * @throws RuntimeException */ private function scanDocumentationFiles(): void { if (! is_dir(self::DOCS_PATH)) { throw new RuntimeException('Documentation directory not found: ' . self::DOCS_PATH); } $files = glob(self::DOCS_PATH . '/*.md'); if (false === $files) { throw new RuntimeException('Failed to scan documentation directory'); } foreach ($files as $file) { $filename = basename($file); if (1 === preg_match('/^([A-Z]+)_SDK\.md$/', $filename, $matches)) { /** @var array{0: non-falsy-string, 1: non-empty-string} $matches */ $sdkName = strtolower($matches[1]); $this->sdkList[] = $sdkName; $this->index[$sdkName] = [ 'name' => $matches[1] . ' SDK', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseDocumentationFile($file, $sdkName); } elseif ('AUTHORING_OPENFGA_MODELS.md' === $filename) { $this->index['authoring'] = [ 'name' => 'Model Authoring Guide', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseGeneralDocumentation($file, 'authoring'); } elseif ('OPENFGA_DOCS.md' === $filename) { $this->index['general'] = [ 'name' => 'OpenFGA Documentation', 'file' => $file, 'sections' => [], 'classes' => [], 'chunks' => [], 'source' => null, 'generated' => null, ]; $this->parseGeneralDocumentation($file, 'general'); } } } }�jNujT&ja&jn&j{&j�&j�&j�&j�&j�&j�&j�&j�&j�&j�&j'j'j 'j-'j:'jK'jT'ja'jn'j{'j�'j�'j�'j�'j�'j�'j�'j�'j�'j�'j(j(j$(j1(j>(jO(j\(ji(jr(j(j�(j�(j�(j�(j�(j�(j�(j�(j�(j�(j )j)j()j5)jB)jO)j\)ji)jv)j�)j�)j�)j�)j�)j�)j�)j�)j�)j�)j*j*j*j,*j9*jF*jS*j`*jm*jz*j�*j�*j�*j�*j�*j�*j�*j�*j�*j+j +j+j'+j0+j=+jJ+jW+jd+jq+j~+j�+j�+j�+j�+j�+j�+j�+j�+j�+j,j ,j,j',j4,jA,jN,j[,jh,ju,j�,j�,j�,j�,j�,j�,j�,j�,j�,j�,j-j-j-j+-j8-jE-jR-j_-jl-jy-j�-j�-j�-j�-j�-j�-j�-j�-j�-j�-j.j.j".j/.j<.jI.jV.jc.jp.j}.j�.j�.j�.j�.j�.j�.j�.j�.j�.j�.j/j/j&/j3/j@/jM/e]�(j4&jJ&e����u.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/evansims/openfga-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server