MCP Browser Automation Server

// Note: These are directly copied from https://github.com/threeplanetssoftware/apple_cloud_notes_parser/blob/master/proto/notestore.proto // Their work is amazing. Without these I would be absolutely lost. // And I copied it from the excellent https://github.com/HamburgChimps/apple-notes-liberator syntax = "proto2"; package com.ciofecaforensics; // // Common classes used across a few types // //Represents a color message Color { optional float red = 1; optional float green = 2; optional float blue = 3; optional float alpha = 4; } // Represents an attachment (embedded object) message AttachmentInfo { optional string attachment_identifier = 1; optional string type_uti = 2; } // Represents a font message Font { optional string font_name = 1; optional float point_size = 2; optional int32 font_hints = 3; } // Styles a "Paragraph" (any run of characters in an AttributeRun) message ParagraphStyle { optional int32 style_type = 1 [default = -1]; optional int32 alignment = 2; optional int32 indent_amount = 4; optional Checklist checklist = 5; } // Represents a checklist item message Checklist { optional bytes uuid = 1; optional int32 done = 2; } // Represents an object that has pointers to a key and a value, asserting // somehow that the key object has to do with the value object. message DictionaryElement { optional ObjectID key = 1; optional ObjectID value = 2; } // A Dictionary holds many DictionaryElements message Dictionary { repeated DictionaryElement element = 1; } // ObjectIDs are used to identify objects within the protobuf, offsets in an arry, or // a simple String. message ObjectID { optional uint64 unsigned_integer_value = 2; optional string string_value = 4; optional int32 object_index = 6; } // Register Latest is used to identify the most recent version message RegisterLatest { optional ObjectID contents = 2; } // MapEntries have a key that maps to an array of key items and a value that points to an object. message MapEntry { optional int32 key = 1; optional ObjectID value = 2; } // Represents a "run" of characters that need to be styled/displayed/etc message AttributeRun { optional int32 length = 1; optional ParagraphStyle paragraph_style = 2; optional Font font = 3; optional int32 font_weight = 5; optional int32 underlined = 6; optional int32 strikethrough = 7; optional int32 superscript = 8; //Sign indicates super/sub optional string link = 9; optional Color color = 10; optional AttachmentInfo attachment_info = 12; } // // Classes related to the overall Note protobufs // // Overarching object in a ZNOTEDATA.ZDATA blob message NoteStoreProto { optional Document document = 2; } // A Document has a Note within it. message Document { optional int32 version = 2; optional Note note = 3; } // A Note has both text, and then a lot of formatting entries. // Other fields are present and not yet included in this proto. message Note { optional string note_text = 2; repeated AttributeRun attribute_run = 5; } // // Classes related to embedded objects // // Represents the top level object in a ZMERGEABLEDATA cell message MergableDataProto { optional MergableDataObject mergable_data_object = 2; } // Similar to Document for Notes, this is what holds the mergeable object message MergableDataObject { optional int32 version = 2; // Asserted to be version in https://github.com/dunhamsteve/notesutils optional MergeableDataObjectData mergeable_data_object_data = 3; } // This is the mergeable data object itself and has a lot of entries that are the parts of it // along with arrays of key, type, and UUID items, depending on type. message MergeableDataObjectData { repeated MergeableDataObjectEntry mergeable_data_object_entry = 3; repeated string mergeable_data_object_key_item = 4; repeated string mergeable_data_object_type_item = 5; repeated bytes mergeable_data_object_uuid_item = 6; } // Each entry is part of the pbject. For example, one entry might be identifying which // UUIDs are rows, and another might hold the text of a cell. message MergeableDataObjectEntry { optional RegisterLatest register_latest = 1; optional List list = 5; optional Dictionary dictionary = 6; optional UnknownMergeableDataObjectEntryMessage unknown_message = 9; optional Note note = 10; optional MergeableDataObjectMap custom_map = 13; optional OrderedSet ordered_set = 16; } // This is unknown, it first was noticed in folder order analysis. message UnknownMergeableDataObjectEntryMessage { optional UnknownMergeableDataObjectEntryMessageEntry unknown_entry = 1; } // This is unknown, it first was noticed in folder order analysis. // "unknown_int2" is where the folder order is stored message UnknownMergeableDataObjectEntryMessageEntry { optional int32 unknown_int1 = 1; optional int64 unknown_int2 = 2; } // The Object Map uses its type to identify what you are looking at and // then a map entry to do something with that value. message MergeableDataObjectMap { optional int32 type = 1; repeated MapEntry map_entry = 3; } // An ordered set is used to hold structural information for embedded tables message OrderedSet { optional OrderedSetOrdering ordering = 1; optional Dictionary elements = 2; } // The ordered set ordering identifies rows and columns in embedded tables, with an array // of the objects and contents that map lookup values to originals. message OrderedSetOrdering { optional OrderedSetOrderingArray array = 1; optional Dictionary contents = 2; } // This array holds both the text to replace and the array of UUIDs to tell what // embedded rows and columns are. message OrderedSetOrderingArray { optional Note contents = 1; repeated OrderedSetOrderingArrayAttachment attachment = 2; } // This array identifies the UUIDs that are embedded table rows or columns message OrderedSetOrderingArrayAttachment { optional int32 index = 1; optional bytes uuid = 2; } // A List holds details about multiple objects message List { repeated ListEntry list_entry = 1; } // A list Entry holds details about a specific object message ListEntry { optional ObjectID id = 2; optional ListEntryDetails details = 3; // I dislike this naming, but don't have better information optional ListEntryDetails additional_details = 4; } // List Entry Details hold another object ID and unidentified mapping message ListEntryDetails { optional ListEntryDetailsKey list_entry_details_key= 1; optional ObjectID id = 2; } message ListEntryDetailsKey { optional int32 list_entry_details_type_index = 1; optional int32 list_entry_details_key = 2; }